| 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 Reader for the VTK HDF file format for unstructured grids. | ||
| 7 | */ | ||
| 8 | #ifndef GRIDFORMAT_VTK_HDF_UNSTRUCTURED_GRID_READER_HPP_ | ||
| 9 | #define GRIDFORMAT_VTK_HDF_UNSTRUCTURED_GRID_READER_HPP_ | ||
| 10 | #if GRIDFORMAT_HAVE_HIGH_FIVE | ||
| 11 | |||
| 12 | #include <iterator> | ||
| 13 | #include <optional> | ||
| 14 | #include <algorithm> | ||
| 15 | #include <type_traits> | ||
| 16 | #include <concepts> | ||
| 17 | #include <numeric> | ||
| 18 | #include <utility> | ||
| 19 | #include <cassert> | ||
| 20 | |||
| 21 | #include <gridformat/common/field.hpp> | ||
| 22 | #include <gridformat/common/field_transformations.hpp> | ||
| 23 | #include <gridformat/common/concepts.hpp> | ||
| 24 | #include <gridformat/common/exceptions.hpp> | ||
| 25 | #include <gridformat/grid/reader.hpp> | ||
| 26 | #include <gridformat/parallel/concepts.hpp> | ||
| 27 | #include <gridformat/vtk/hdf_common.hpp> | ||
| 28 | |||
| 29 | namespace GridFormat { | ||
| 30 | |||
| 31 | /*! | ||
| 32 | * \ingroup VTK | ||
| 33 | * \brief Reader for the VTK-HDF file format for unstructured grids. | ||
| 34 | */ | ||
| 35 | template<Concepts::Communicator Communicator = NullCommunicator> | ||
| 36 | class VTKHDFUnstructuredGridReader : public GridReader { | ||
| 37 | using HDF5File = HDF5::File<Communicator>; | ||
| 38 | static constexpr std::size_t vtk_space_dim = 3; | ||
| 39 | static constexpr bool read_rank_piece_only = !std::is_same_v<Communicator, NullCommunicator>; | ||
| 40 | |||
| 41 | public: | ||
| 42 | 3 | explicit VTKHDFUnstructuredGridReader() requires(std::is_same_v<Communicator, NullCommunicator>) | |
| 43 | 3 | : _comm{} | |
| 44 | 3 | {} | |
| 45 | |||
| 46 | 72 | explicit VTKHDFUnstructuredGridReader(Communicator comm) | |
| 47 | 72 | : _comm{comm} | |
| 48 | 72 | {} | |
| 49 | |||
| 50 | private: | ||
| 51 | 1 | std::string _name() const override { | |
| 52 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
|
1 | if (_is_transient()) |
| 53 | ✗ | return "VTKHDFUnstructuredGridReader (transient)"; | |
| 54 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | return "VTKHDFUnstructuredGridReader"; |
| 55 | } | ||
| 56 | |||
| 57 | 75 | void _open(const std::string& filename, typename GridReader::FieldNames& field_names) override { | |
| 58 |
1/2✓ Branch 1 taken 45 times.
✗ Branch 2 not taken.
|
75 | _close(); |
| 59 |
2/4✓ Branch 1 taken 45 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 45 times.
✗ Branch 5 not taken.
|
75 | _file = HDF5File{filename, _comm, HDF5File::read_only}; |
| 60 |
2/4✓ Branch 1 taken 45 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 45 times.
✗ Branch 5 not taken.
|
75 | const auto type = VTKHDF::get_file_type(_file.value()); |
| 61 |
2/4✓ Branch 1 taken 45 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 45 times.
|
75 | if (type != "UnstructuredGrid") |
| 62 | ✗ | throw ValueError("Incompatible VTK-HDF type: '" + type + "', expected 'UnstructuredGrid'."); | |
| 63 | |||
| 64 |
2/4✓ Branch 1 taken 45 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 45 times.
✗ Branch 5 not taken.
|
75 | VTKHDF::check_version_compatibility(_file.value(), {2, 0}); |
| 65 | |||
| 66 |
4/6✓ Branch 2 taken 45 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 45 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 19 times.
✓ Branch 9 taken 26 times.
|
225 | if (_file->exists("VTKHDF/Steps")) |
| 67 |
2/4✓ Branch 2 taken 19 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 19 times.
✗ Branch 6 not taken.
|
146 | _file->visit_attribute("VTKHDF/Steps/NSteps", [&] (auto&& field) { |
| 68 | 19 | _num_steps.emplace(); | |
| 69 | 19 | field.export_to(_num_steps.value()); | |
| 70 | 19 | _step_index.emplace(0); | |
| 71 | }); | ||
| 72 | |||
| 73 |
1/2✓ Branch 1 taken 45 times.
✗ Branch 2 not taken.
|
75 | _compute_piece_offsets(); |
| 74 | 195 | const auto copy_names_in = [&] (const std::string& group, auto& storage) { | |
| 75 |
4/4✓ Branch 2 taken 45 times.
✓ Branch 3 taken 6 times.
✓ Branch 6 taken 76 times.
✓ Branch 7 taken 8 times.
|
135 | if (_file->exists(group)) |
| 76 |
4/8✓ Branch 3 taken 45 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 45 times.
✗ Branch 7 not taken.
✓ Branch 13 taken 76 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 76 times.
✗ Branch 17 not taken.
|
121 | std::ranges::copy(_file->dataset_names_in(group), std::back_inserter(storage)); |
| 77 | }; | ||
| 78 |
2/4✓ Branch 1 taken 45 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 45 times.
✗ Branch 5 not taken.
|
150 | copy_names_in("VTKHDF/CellData", field_names.cell_fields); |
| 79 |
2/4✓ Branch 1 taken 45 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 45 times.
✗ Branch 5 not taken.
|
150 | copy_names_in("VTKHDF/PointData", field_names.point_fields); |
| 80 |
2/4✓ Branch 1 taken 45 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 45 times.
✗ Branch 5 not taken.
|
150 | copy_names_in("VTKHDF/FieldData", field_names.meta_data_fields); |
| 81 | 75 | } | |
| 82 | |||
| 83 | 75 | void _close() override { | |
| 84 |
1/2✓ Branch 2 taken 45 times.
✗ Branch 3 not taken.
|
75 | _file = {}; |
| 85 | 75 | _num_cells = 0; | |
| 86 | 75 | _num_points = 0; | |
| 87 | 75 | _cell_offset = 0; | |
| 88 | 75 | _point_offset = 0; | |
| 89 | 75 | _num_steps = {}; | |
| 90 | 75 | _step_index = {}; | |
| 91 | 75 | } | |
| 92 | |||
| 93 | 303 | void _compute_piece_offsets() { | |
| 94 | 303 | _cell_offset = 0; | |
| 95 | 303 | _point_offset = 0; | |
| 96 |
1/2✓ Branch 1 taken 116 times.
✗ Branch 2 not taken.
|
303 | _check_communicator_size(); |
| 97 |
2/4✓ Branch 1 taken 181 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 181 times.
✗ Branch 5 not taken.
|
606 | const auto num_step_cells = _number_of_all_piece_entities("Cells"); |
| 98 |
2/4✓ Branch 1 taken 181 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 181 times.
✗ Branch 5 not taken.
|
303 | const auto num_step_points = _number_of_all_piece_entities("Points"); |
| 99 | if constexpr (read_rank_piece_only) { | ||
| 100 |
1/2✓ Branch 1 taken 116 times.
✗ Branch 2 not taken.
|
232 | const auto my_rank = Parallel::rank(_comm); |
| 101 |
1/2✓ Branch 1 taken 116 times.
✗ Branch 2 not taken.
|
232 | _num_cells = num_step_cells.at(my_rank); |
| 102 |
1/2✓ Branch 1 taken 116 times.
✗ Branch 2 not taken.
|
232 | _num_points = num_step_points.at(my_rank); |
| 103 | 232 | _cell_offset += _accumulate_until(my_rank, num_step_cells); | |
| 104 | 232 | _point_offset += _accumulate_until(my_rank, num_step_points); | |
| 105 | } else { | ||
| 106 | 71 | _num_cells = _accumulate_until(num_step_cells.size(), num_step_cells); | |
| 107 | 71 | _num_points = _accumulate_until(num_step_points.size(), num_step_points); | |
| 108 | } | ||
| 109 | 303 | } | |
| 110 | |||
| 111 | 1663 | std::size_t _get_part_offset() const { | |
| 112 | 1663 | return _is_transient() | |
| 113 |
13/28✓ Branch 0 taken 874 times.
✓ Branch 1 taken 141 times.
✓ Branch 3 taken 874 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 874 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 874 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 874 times.
✓ Branch 13 taken 141 times.
✓ Branch 14 taken 874 times.
✓ Branch 15 taken 141 times.
✓ Branch 17 taken 874 times.
✓ Branch 18 taken 141 times.
✓ Branch 20 taken 874 times.
✓ Branch 21 taken 141 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
|
7622 | ? _access_file().template read_dataset_to<std::size_t>( |
| 114 | "/VTKHDF/Steps/PartOffsets", | ||
| 115 | HDF5::Slice{ | ||
| 116 |
1/2✓ Branch 1 taken 874 times.
✗ Branch 2 not taken.
|
1432 | .offset = {_step_index.value()}, |
| 117 | .count = {1} | ||
| 118 | }) | ||
| 119 |
2/2✓ Branch 0 taken 874 times.
✓ Branch 1 taken 141 times.
|
3326 | : std::size_t{0}; |
| 120 |
4/14✓ Branch 1 taken 874 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 874 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 874 times.
✓ Branch 9 taken 141 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
|
7391 | } |
| 121 | |||
| 122 | 926 | std::size_t _get_step_cells_offset() const { | |
| 123 | 926 | return _is_transient() | |
| 124 |
15/30✓ Branch 0 taken 472 times.
✓ Branch 1 taken 74 times.
✓ Branch 3 taken 472 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 472 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 472 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 472 times.
✓ Branch 13 taken 74 times.
✓ Branch 14 taken 472 times.
✓ Branch 15 taken 74 times.
✓ Branch 17 taken 472 times.
✓ Branch 18 taken 74 times.
✓ Branch 20 taken 472 times.
✓ Branch 21 taken 74 times.
✓ Branch 22 taken 472 times.
✓ Branch 23 taken 74 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
|
5052 | ? _access_file().template read_dataset_to<std::size_t>( |
| 125 | "VTKHDF/Steps/CellOffsets", | ||
| 126 | HDF5::Slice{ | ||
| 127 |
1/2✓ Branch 1 taken 472 times.
✗ Branch 2 not taken.
|
800 | .offset = {_step_index.value(), 0}, |
| 128 | .count = {1, 1} | ||
| 129 | }) | ||
| 130 |
2/2✓ Branch 0 taken 472 times.
✓ Branch 1 taken 74 times.
|
1852 | : std::size_t{0}; |
| 131 |
2/12✓ Branch 1 taken 472 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 472 times.
✗ Branch 5 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
|
3326 | } |
| 132 | |||
| 133 | 227 | std::size_t _get_step_points_offset() const { | |
| 134 | 227 | return _is_transient() | |
| 135 |
13/28✓ Branch 0 taken 113 times.
✓ Branch 1 taken 22 times.
✓ Branch 3 taken 113 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 113 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 113 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 113 times.
✓ Branch 13 taken 22 times.
✓ Branch 14 taken 113 times.
✓ Branch 15 taken 22 times.
✓ Branch 17 taken 113 times.
✓ Branch 18 taken 22 times.
✓ Branch 20 taken 113 times.
✓ Branch 21 taken 22 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
|
1024 | ? _access_file().template read_dataset_to<std::size_t>( |
| 136 | "VTKHDF/Steps/PointOffsets", | ||
| 137 | HDF5::Slice{ | ||
| 138 |
1/2✓ Branch 1 taken 113 times.
✗ Branch 2 not taken.
|
190 | .offset = {_step_index.value()}, |
| 139 | .count = {1} | ||
| 140 | }) | ||
| 141 |
2/2✓ Branch 0 taken 113 times.
✓ Branch 1 taken 22 times.
|
454 | : std::size_t{0}; |
| 142 |
4/14✓ Branch 1 taken 113 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 113 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 113 times.
✓ Branch 9 taken 22 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
|
987 | } |
| 143 | |||
| 144 | 463 | std::size_t _get_connectivity_id_offset() const { | |
| 145 | 463 | return _is_transient() | |
| 146 |
15/30✓ Branch 0 taken 236 times.
✓ Branch 1 taken 37 times.
✓ Branch 3 taken 236 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 236 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 236 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 236 times.
✓ Branch 13 taken 37 times.
✓ Branch 14 taken 236 times.
✓ Branch 15 taken 37 times.
✓ Branch 17 taken 236 times.
✓ Branch 18 taken 37 times.
✓ Branch 20 taken 236 times.
✓ Branch 21 taken 37 times.
✓ Branch 22 taken 236 times.
✓ Branch 23 taken 37 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
|
2526 | ? _access_file().template read_dataset_to<std::size_t>( |
| 147 | "VTKHDF/Steps/ConnectivityIdOffsets", | ||
| 148 | HDF5::Slice{ | ||
| 149 |
1/2✓ Branch 1 taken 236 times.
✗ Branch 2 not taken.
|
400 | .offset = {_step_index.value(), 0}, |
| 150 | .count = {1, 1} | ||
| 151 | }) | ||
| 152 |
2/2✓ Branch 0 taken 236 times.
✓ Branch 1 taken 37 times.
|
926 | : std::size_t{0}; |
| 153 |
2/12✓ Branch 1 taken 236 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 236 times.
✗ Branch 5 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
|
1663 | } |
| 154 | |||
| 155 | 1154 | std::size_t _get_cell_data_offset(std::string_view name) const { | |
| 156 | 1154 | return _is_transient() | |
| 157 |
8/18✓ Branch 0 taken 570 times.
✓ Branch 1 taken 116 times.
✓ Branch 3 taken 570 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 570 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 570 times.
✓ Branch 10 taken 116 times.
✓ Branch 12 taken 570 times.
✓ Branch 13 taken 116 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
4228 | ? _access_file().template read_dataset_to<std::size_t>( |
| 158 |
8/16✓ Branch 1 taken 570 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 570 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 570 times.
✓ Branch 8 taken 116 times.
✓ Branch 10 taken 570 times.
✓ Branch 11 taken 116 times.
✓ Branch 12 taken 570 times.
✓ Branch 13 taken 116 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
3074 | "VTKHDF/Steps/CellDataOffsets/" + std::string{name}, |
| 159 | HDF5::Slice{ | ||
| 160 |
1/2✓ Branch 1 taken 570 times.
✗ Branch 2 not taken.
|
960 | .offset = {_step_index.value()}, |
| 161 | .count = {1} | ||
| 162 | }) | ||
| 163 |
2/2✓ Branch 0 taken 570 times.
✓ Branch 1 taken 116 times.
|
2308 | : std::size_t{0}; |
| 164 |
4/14✓ Branch 1 taken 570 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 570 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 570 times.
✓ Branch 9 taken 116 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
|
4994 | } |
| 165 | |||
| 166 | 1162 | std::size_t _get_point_data_offset(std::string_view name) const { | |
| 167 | 1162 | return _is_transient() | |
| 168 |
8/18✓ Branch 0 taken 570 times.
✓ Branch 1 taken 120 times.
✓ Branch 3 taken 570 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 570 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 570 times.
✓ Branch 10 taken 120 times.
✓ Branch 12 taken 570 times.
✓ Branch 13 taken 120 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
4244 | ? _access_file().template read_dataset_to<std::size_t>( |
| 169 |
8/16✓ Branch 1 taken 570 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 570 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 570 times.
✓ Branch 8 taken 120 times.
✓ Branch 10 taken 570 times.
✓ Branch 11 taken 120 times.
✓ Branch 12 taken 570 times.
✓ Branch 13 taken 120 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
3082 | "VTKHDF/Steps/PointDataOffsets/" + std::string{name}, |
| 170 | HDF5::Slice{ | ||
| 171 |
1/2✓ Branch 1 taken 570 times.
✗ Branch 2 not taken.
|
960 | .offset = {_step_index.value()}, |
| 172 | .count = {1} | ||
| 173 | }) | ||
| 174 |
2/2✓ Branch 0 taken 570 times.
✓ Branch 1 taken 120 times.
|
2324 | : std::size_t{0}; |
| 175 |
4/14✓ Branch 1 taken 570 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 570 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 570 times.
✓ Branch 9 taken 120 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
|
5002 | } |
| 176 | |||
| 177 | 150 | std::size_t _get_field_data_offset(std::string_view name) const { | |
| 178 | 150 | return _is_transient() | |
| 179 |
5/18✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 90 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 90 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 90 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 90 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
600 | ? _access_file().template read_dataset_to<std::size_t>( |
| 180 |
5/16✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 90 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 90 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 90 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 90 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
450 | "VTKHDF/Steps/FieldDataOffsets/" + std::string{name}, |
| 181 | HDF5::Slice{ | ||
| 182 |
1/2✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
|
150 | .offset = {_step_index.value()}, |
| 183 | .count = {1} | ||
| 184 | }) | ||
| 185 |
1/2✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
|
300 | : std::size_t{0}; |
| 186 |
3/14✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 90 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 90 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
|
750 | } |
| 187 | |||
| 188 | 45 | bool _is_sequence() const override { | |
| 189 | 45 | return _is_transient(); | |
| 190 | } | ||
| 191 | |||
| 192 | 542 | std::size_t _number_of_steps() const override { | |
| 193 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 322 times.
|
542 | if (!_num_steps) |
| 194 | ✗ | throw ValueError("No step information available"); | |
| 195 | 542 | return _num_steps.value(); | |
| 196 | } | ||
| 197 | |||
| 198 | 160 | double _time_at_step(std::size_t step_idx) const override { | |
| 199 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 95 times.
|
160 | if (step_idx >= _number_of_steps()) |
| 200 | ✗ | throw ValueError("Only " + as_string(_number_of_steps()) + " available"); | |
| 201 |
2/4✓ Branch 2 taken 95 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 95 times.
✗ Branch 6 not taken.
|
640 | return _access_file().template read_dataset_to<double>("/VTKHDF/Steps/Values", HDF5::Slice{ |
| 202 | .offset = {step_idx}, | ||
| 203 | .count = {1} | ||
| 204 | 320 | }); | |
| 205 |
2/8✓ Branch 1 taken 95 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 95 times.
✗ Branch 5 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
|
640 | } |
| 206 | |||
| 207 | 260 | void _set_step(std::size_t step_idx, typename GridReader::FieldNames&) override { | |
| 208 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 155 times.
|
260 | if (step_idx >= _number_of_steps()) |
| 209 | ✗ | throw ValueError("Only " + as_string(_number_of_steps()) + " available"); | |
| 210 |
2/2✓ Branch 1 taken 136 times.
✓ Branch 2 taken 19 times.
|
260 | if (step_idx != _step_index.value()) { |
| 211 | 228 | _compute_piece_offsets(); | |
| 212 | 228 | _step_index = step_idx; | |
| 213 | } | ||
| 214 | 260 | } | |
| 215 | |||
| 216 | 377 | std::size_t _number_of_cells() const override { | |
| 217 | 377 | return _num_cells; | |
| 218 | } | ||
| 219 | |||
| 220 | 721 | std::size_t _number_of_points() const override { | |
| 221 | 721 | return _num_points; | |
| 222 | } | ||
| 223 | |||
| 224 | 28 | std::size_t _number_of_pieces() const override { | |
| 225 | 28 | return _number_of_current_pieces_in_file(); | |
| 226 | } | ||
| 227 | |||
| 228 | 2030 | std::size_t _number_of_current_pieces_in_file() const { | |
| 229 |
2/2✓ Branch 1 taken 1062 times.
✓ Branch 2 taken 180 times.
|
2030 | if (_is_transient()) |
| 230 | 1734 | return _number_of_pieces_in_file_at_step(_step_index.value()); | |
| 231 | 296 | return _total_number_of_pieces(); | |
| 232 | } | ||
| 233 | |||
| 234 | 296 | std::size_t _total_number_of_pieces() const { | |
| 235 |
3/6✓ Branch 1 taken 180 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 180 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 180 times.
✗ Branch 8 not taken.
|
592 | auto ncells = _access_file().get_dimensions("/VTKHDF/NumberOfCells"); |
| 236 |
1/4✗ Branch 1 not taken.
✓ Branch 2 taken 180 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
296 | if (!ncells) throw IOError("Missing dataset at '/VTKHDF/NumberOfCells'"); |
| 237 |
1/4✗ Branch 2 not taken.
✓ Branch 3 taken 180 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
296 | if (ncells->size() != 1) throw IOError("Unexpected dimension of '/VTKHDF/NumberOfCells'"); |
| 238 |
1/2✓ Branch 2 taken 180 times.
✗ Branch 3 not taken.
|
592 | return ncells->at(0); |
| 239 | 296 | } | |
| 240 | |||
| 241 | 2554 | std::size_t _number_of_pieces_in_file_at_step(std::size_t step) const { | |
| 242 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1546 times.
|
2554 | if (!_is_transient()) |
| 243 | ✗ | throw InvalidState("Step data only available in transient files"); | |
| 244 |
3/6✓ Branch 2 taken 1546 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1546 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1546 times.
✗ Branch 9 not taken.
|
7662 | if (const auto& file = _access_file(); file.exists("/VTKHDF/Steps/NumberOfParts")) |
| 245 |
3/6✓ Branch 2 taken 1546 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1546 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1546 times.
✗ Branch 9 not taken.
|
7662 | return file.template read_dataset_to<std::vector<std::size_t>>("/VTKHDF/Steps/NumberOfParts").at(step); |
| 246 | |||
| 247 | // all steps have the same number of parts | ||
| 248 | ✗ | if (_total_number_of_pieces()%_num_steps.value() != 0) | |
| 249 | ✗ | throw IOError( | |
| 250 | "Cannot deduce the number of pieces. " | ||
| 251 | "The dataset '/VTKHDF/Steps/NumberOfParts' is not available, " | ||
| 252 | "but the total number of pieces is not divisble by the number of steps" | ||
| 253 | ); | ||
| 254 | ✗ | return _total_number_of_pieces()/_num_steps.value(); | |
| 255 | } | ||
| 256 | |||
| 257 | 303 | void _check_communicator_size() const { | |
| 258 | if constexpr (!std::is_same_v<Communicator, NullCommunicator>) | ||
| 259 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 116 times.
|
232 | if (_number_of_current_pieces_in_file() != static_cast<std::size_t>(Parallel::size(_comm))) |
| 260 | ✗ | throw SizeError( | |
| 261 | "Can only read the file in parallel if the size of the communicator matches the size " | ||
| 262 | "of that used when writing the file. Please read in the file sequentially on one process " | ||
| 263 | "and distribute the grid yourself, or restart the parallel run with " | ||
| 264 | ✗ | + std::to_string(_number_of_current_pieces_in_file()) + " processes." | |
| 265 | ); | ||
| 266 | 303 | } | |
| 267 | |||
| 268 | 439 | void _visit_cells(const typename GridReader::CellVisitor& visitor) const override { | |
| 269 | if constexpr (read_rank_piece_only) | ||
| 270 | 332 | _visit_cells_for_rank(Parallel::rank(_comm), 0, visitor); | |
| 271 | else | ||
| 272 |
1/2✓ Branch 1 taken 95 times.
✗ Branch 2 not taken.
|
107 | std::ranges::for_each( |
| 273 |
2/4✓ Branch 1 taken 95 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 95 times.
✗ Branch 5 not taken.
|
107 | std::views::iota(std::size_t{0}, _number_of_current_pieces_in_file()), |
| 274 | 107 | [&] (int rank) mutable { | |
| 275 |
2/4✓ Branch 1 taken 107 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 107 times.
✗ Branch 5 not taken.
|
321 | const auto [_, base_offset] = _number_of_entities_and_offset_at_rank(rank, "Points"); |
| 276 |
1/2✓ Branch 1 taken 107 times.
✗ Branch 2 not taken.
|
107 | _visit_cells_for_rank(rank, base_offset, visitor); |
| 277 | } | ||
| 278 | ); | ||
| 279 | 439 | } | |
| 280 | |||
| 281 | 463 | void _visit_cells_for_rank(int piece_rank, | |
| 282 | std::size_t point_base_offset, | ||
| 283 | const typename GridReader::CellVisitor& visitor) const { | ||
| 284 |
1/2✓ Branch 1 taken 273 times.
✗ Branch 2 not taken.
|
463 | const auto& file = _access_file(); |
| 285 |
2/4✓ Branch 1 taken 273 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 273 times.
✗ Branch 5 not taken.
|
926 | const auto [my_num_cells, my_cell_offset] = _number_of_entities_and_offset_at_rank(piece_rank, "Cells"); |
| 286 |
2/4✓ Branch 1 taken 273 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 273 times.
✗ Branch 5 not taken.
|
926 | const auto num_connectivity_ids = file.template read_dataset_to<std::vector<std::size_t>>( |
| 287 | "VTKHDF/NumberOfConnectivityIds", | ||
| 288 | HDF5::Slice{ | ||
| 289 |
1/2✓ Branch 1 taken 273 times.
✗ Branch 2 not taken.
|
463 | .offset = {_get_part_offset()}, |
| 290 | 926 | .count = {_number_of_current_pieces_in_file()} | |
| 291 | } | ||
| 292 | ); | ||
| 293 | 926 | const auto my_num_connectivity_ids = num_connectivity_ids.at(piece_rank); | |
| 294 | 463 | const auto my_id_offset = std::accumulate( | |
| 295 | num_connectivity_ids.begin(), | ||
| 296 | 463 | num_connectivity_ids.begin() + piece_rank, | |
| 297 | std::size_t{0} | ||
| 298 | ); | ||
| 299 | |||
| 300 |
2/4✓ Branch 1 taken 273 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 273 times.
✗ Branch 5 not taken.
|
926 | auto offsets = file.template read_dataset_to<std::vector<std::size_t>>("VTKHDF/Offsets", {{ |
| 301 | // offsets have length num_cells+1, so we need to add +1 per rank to the cell offsets | ||
| 302 | .offset = { | ||
| 303 |
2/4✓ Branch 1 taken 273 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 273 times.
✗ Branch 6 not taken.
|
463 | _get_step_cells_offset() + _accumulate_over_pieces_until_step(_step_index.value_or(0), 1) // offset from step |
| 304 | 463 | + my_cell_offset + piece_rank // offset from this piece in the pieces of the current step | |
| 305 | }, | ||
| 306 | 463 | .count = {my_num_cells + 1} | |
| 307 | }}); | ||
| 308 |
2/4✓ Branch 1 taken 273 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 273 times.
✗ Branch 5 not taken.
|
926 | auto types = file.template read_dataset_to<std::vector<std::uint_least8_t>>( |
| 309 | "VTKHDF/Types", | ||
| 310 | 926 | {{.offset = {_get_step_cells_offset() + my_cell_offset}, .count = {my_num_cells}}} | |
| 311 | ); | ||
| 312 |
2/4✓ Branch 1 taken 273 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 273 times.
✗ Branch 5 not taken.
|
926 | auto connectivity = file.template read_dataset_to<std::vector<std::size_t>>( |
| 313 | "VTKHDF/Connectivity", | ||
| 314 | 926 | {{.offset = {_get_connectivity_id_offset() + my_id_offset}, .count = {my_num_connectivity_ids}}} | |
| 315 | ); | ||
| 316 | |||
| 317 | 463 | std::vector<std::size_t> corners; | |
| 318 |
2/2✓ Branch 1 taken 3524 times.
✓ Branch 2 taken 273 times.
|
6299 | for (std::size_t i = 0; i < types.size(); ++i) { |
| 319 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 3524 times.
|
5836 | assert(i < offsets.size() - 1); |
| 320 |
3/6✓ Branch 1 taken 3524 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3524 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 3524 times.
|
5836 | assert(offsets.at(i+1) > offsets.at(i)); |
| 321 |
1/2✓ Branch 1 taken 3524 times.
✗ Branch 2 not taken.
|
5836 | const auto p0_offset = offsets.at(i); |
| 322 |
1/2✓ Branch 1 taken 3524 times.
✗ Branch 2 not taken.
|
5836 | const auto num_corners = offsets.at(i+1) - p0_offset; |
| 323 | |||
| 324 |
1/2✓ Branch 1 taken 3524 times.
✗ Branch 2 not taken.
|
5836 | corners.resize(num_corners); |
| 325 |
2/2✓ Branch 0 taken 14096 times.
✓ Branch 1 taken 3524 times.
|
29180 | for (std::size_t c = 0; c < num_corners; ++c) |
| 326 |
1/2✓ Branch 1 taken 14096 times.
✗ Branch 2 not taken.
|
23344 | corners[c] = connectivity.at(p0_offset + c) + point_base_offset; |
| 327 |
3/6✓ Branch 1 taken 3524 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3524 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3524 times.
✗ Branch 8 not taken.
|
5836 | visitor(VTK::cell_type(types.at(i)), corners); |
| 328 | } | ||
| 329 |
12/40✓ Branch 1 taken 273 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 273 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 273 times.
✗ Branch 8 not taken.
✓ Branch 12 taken 273 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 273 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 273 times.
✗ Branch 19 not taken.
✓ Branch 23 taken 273 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 273 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 273 times.
✗ Branch 30 not taken.
✓ Branch 34 taken 273 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 273 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 273 times.
✗ Branch 41 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
|
6945 | } |
| 330 | |||
| 331 | 227 | FieldPtr _points() const override { | |
| 332 |
1/2✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
|
227 | const std::string path = "VTKHDF/Points"; |
| 333 |
2/4✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 135 times.
✗ Branch 5 not taken.
|
681 | return make_field_ptr(VTKHDF::DataSetField{ |
| 334 | _file.value(), | ||
| 335 |
1/2✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
|
227 | MDLayout{{_num_points, vtk_space_dim}}, |
| 336 |
3/6✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 135 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 135 times.
✗ Branch 8 not taken.
|
227 | _file.value().get_precision(path).value(), |
| 337 |
1/2✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
|
454 | _serialization_callback(path, HDF5::Slice{ |
| 338 |
1/2✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
|
227 | .offset = {_point_offset + _get_step_points_offset(), 0}, |
| 339 | 227 | .count = {_num_points, vtk_space_dim} | |
| 340 | }) | ||
| 341 |
1/2✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
|
454 | }); |
| 342 |
2/8✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 135 times.
✗ Branch 5 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
|
908 | } |
| 343 | |||
| 344 | 1154 | FieldPtr _cell_field(std::string_view name) const override { | |
| 345 |
2/4✓ Branch 1 taken 686 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 686 times.
✗ Branch 5 not taken.
|
1154 | const std::string path = "VTKHDF/CellData/" + std::string{name}; |
| 346 |
2/4✓ Branch 1 taken 686 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 686 times.
✗ Branch 5 not taken.
|
1154 | const auto slice = _get_slice(path, _num_cells, _cell_offset + _get_cell_data_offset(name)); |
| 347 |
3/6✓ Branch 1 taken 686 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 686 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 686 times.
✗ Branch 8 not taken.
|
3462 | return make_field_ptr(VTKHDF::DataSetField{ |
| 348 | _file.value(), | ||
| 349 | MDLayout{slice.count}, | ||
| 350 |
3/6✓ Branch 1 taken 686 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 686 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 686 times.
✗ Branch 8 not taken.
|
1154 | _file.value().get_precision(path).value(), |
| 351 |
2/4✓ Branch 1 taken 686 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 686 times.
✗ Branch 5 not taken.
|
2308 | _serialization_callback(path, slice) |
| 352 |
1/2✓ Branch 1 taken 686 times.
✗ Branch 2 not taken.
|
2308 | }); |
| 353 | 1154 | } | |
| 354 | |||
| 355 | 1162 | FieldPtr _point_field(std::string_view name) const override { | |
| 356 |
2/4✓ Branch 1 taken 690 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 690 times.
✗ Branch 5 not taken.
|
1162 | const std::string path = "VTKHDF/PointData/" + std::string{name}; |
| 357 |
2/4✓ Branch 1 taken 690 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 690 times.
✗ Branch 5 not taken.
|
1162 | const auto slice = _get_slice(path, _num_points, _point_offset + _get_point_data_offset(name)); |
| 358 |
3/6✓ Branch 1 taken 690 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 690 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 690 times.
✗ Branch 8 not taken.
|
3486 | return make_field_ptr(VTKHDF::DataSetField{ |
| 359 | _file.value(), | ||
| 360 | MDLayout{slice.count}, | ||
| 361 |
3/6✓ Branch 1 taken 690 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 690 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 690 times.
✗ Branch 8 not taken.
|
1162 | _file.value().get_precision(path).value(), |
| 362 |
2/4✓ Branch 1 taken 690 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 690 times.
✗ Branch 5 not taken.
|
2324 | _serialization_callback(path, slice) |
| 363 |
1/2✓ Branch 1 taken 690 times.
✗ Branch 2 not taken.
|
2324 | }); |
| 364 | 1162 | } | |
| 365 | |||
| 366 | 180 | FieldPtr _meta_data_field(std::string_view name) const override { | |
| 367 |
2/4✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 108 times.
✗ Branch 5 not taken.
|
180 | const auto path = "VTKHDF/FieldData/" + std::string{name}; |
| 368 |
3/6✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 108 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 108 times.
✗ Branch 8 not taken.
|
180 | const auto dims = _file.value().get_dimensions(path).value(); |
| 369 |
2/2✓ Branch 1 taken 18 times.
✓ Branch 2 taken 90 times.
|
180 | if (dims.size() == 1) |
| 370 |
4/8✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 18 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 18 times.
✗ Branch 11 not taken.
|
30 | return make_field_ptr(VTKHDF::DataSetField{_file.value(), path}); |
| 371 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 90 times.
|
150 | if (dims.size() != 2) |
| 372 | ✗ | throw SizeError("Unexpected field data array size"); | |
| 373 |
1/2✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
|
150 | auto offset = dims; |
| 374 |
1/2✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
|
150 | auto count = offset; |
| 375 |
1/2✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
|
150 | count.at(0) = 1; |
| 376 |
1/2✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
|
150 | std::ranges::fill(offset, 0); |
| 377 |
2/4✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 90 times.
✗ Branch 5 not taken.
|
150 | offset.at(0) = _get_field_data_offset(name); |
| 378 |
2/4✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 90 times.
✗ Branch 5 not taken.
|
450 | return make_field_ptr(VTKHDF::DataSetField{ |
| 379 | _file.value(), | ||
| 380 |
2/4✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 90 times.
✗ Branch 5 not taken.
|
150 | MDLayout{count | std::views::drop(1)}, |
| 381 |
3/6✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 90 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 90 times.
✗ Branch 8 not taken.
|
150 | _file.value().get_precision(path).value(), |
| 382 |
4/16✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 90 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 90 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 90 times.
✗ Branch 11 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
318 | [p=path, o=offset, c=count] (const HDF5File& f) { |
| 383 | 60 | return f.visit_dataset(p, [&] <typename F> (F&& field) { | |
| 384 |
8/96✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✓ Branch 86 taken 4 times.
✗ Branch 87 not taken.
✓ Branch 90 taken 4 times.
✗ Branch 91 not taken.
✗ Branch 98 not taken.
✗ Branch 99 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✓ Branch 134 taken 2 times.
✗ Branch 135 not taken.
✓ Branch 138 taken 2 times.
✗ Branch 139 not taken.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 170 not taken.
✗ Branch 171 not taken.
✗ Branch 174 not taken.
✗ Branch 175 not taken.
✗ Branch 182 not taken.
✗ Branch 183 not taken.
✗ Branch 186 not taken.
✗ Branch 187 not taken.
✗ Branch 194 not taken.
✗ Branch 195 not taken.
✗ Branch 198 not taken.
✗ Branch 199 not taken.
✗ Branch 206 not taken.
✗ Branch 207 not taken.
✗ Branch 210 not taken.
✗ Branch 211 not taken.
✗ Branch 218 not taken.
✗ Branch 219 not taken.
✗ Branch 222 not taken.
✗ Branch 223 not taken.
✓ Branch 230 taken 8 times.
✗ Branch 231 not taken.
✓ Branch 234 taken 8 times.
✗ Branch 235 not taken.
✗ Branch 242 not taken.
✗ Branch 243 not taken.
✗ Branch 246 not taken.
✗ Branch 247 not taken.
✗ Branch 254 not taken.
✗ Branch 255 not taken.
✗ Branch 258 not taken.
✗ Branch 259 not taken.
✗ Branch 266 not taken.
✗ Branch 267 not taken.
✗ Branch 270 not taken.
✗ Branch 271 not taken.
✓ Branch 278 taken 4 times.
✗ Branch 279 not taken.
✓ Branch 282 taken 4 times.
✗ Branch 283 not taken.
|
18 | return FlattenedField{make_field_ptr(std::move(field))}.serialized(); |
| 385 |
6/12✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 17 not taken.
|
54 | }, HDF5::Slice{.offset = o, .count = c}); |
| 386 | } | ||
| 387 |
1/2✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
|
150 | }); |
| 388 | 180 | } | |
| 389 | |||
| 390 | template<Concepts::Scalar T> | ||
| 391 | T _read_rank_scalar(const std::string& path, const std::size_t base_offset = 0) const { | ||
| 392 | T result; | ||
| 393 | _file.value().visit_dataset( | ||
| 394 | path, | ||
| 395 | [&] (auto&& field) { field.export_to(result); }, | ||
| 396 | HDF5::Slice{ | ||
| 397 | .offset = {base_offset + static_cast<std::size_t>(Parallel::rank(_comm))}, | ||
| 398 | .count = {1} | ||
| 399 | } | ||
| 400 | ); | ||
| 401 | return result; | ||
| 402 | } | ||
| 403 | |||
| 404 | 2316 | HDF5::Slice _get_slice(const std::string& path, | |
| 405 | std::size_t count, | ||
| 406 | std::size_t offset) const { | ||
| 407 |
3/6✓ Branch 1 taken 1376 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1376 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1376 times.
✗ Branch 8 not taken.
|
2316 | auto ds_size = _file.value().get_dimensions(path).value(); |
| 408 |
1/2✓ Branch 1 taken 1376 times.
✗ Branch 2 not taken.
|
2316 | auto ds_offset = ds_size; |
| 409 |
1/2✓ Branch 1 taken 1376 times.
✗ Branch 2 not taken.
|
2316 | std::ranges::fill(ds_offset, std::size_t{0}); |
| 410 |
1/2✓ Branch 1 taken 1376 times.
✗ Branch 2 not taken.
|
2316 | ds_size.at(0) = count; |
| 411 |
1/2✓ Branch 1 taken 1376 times.
✗ Branch 2 not taken.
|
2316 | ds_offset.at(0) = offset; |
| 412 | 2316 | return {.offset = ds_offset, .count = ds_size}; | |
| 413 |
2/6✓ Branch 1 taken 1376 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1376 times.
✗ Branch 5 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
|
2316 | } |
| 414 | |||
| 415 | 2543 | auto _serialization_callback(std::string path, std::optional<HDF5::Slice> slice = {}) const { | |
| 416 | 3479 | return [_p=std::move(path), _s=std::move(slice)] (const HDF5File& file) { | |
| 417 |
2/4✓ Branch 1 taken 509 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 858 times.
✗ Branch 5 not taken.
|
1367 | if (_s) |
| 418 |
6/12✓ Branch 1 taken 509 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 509 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 509 times.
✗ Branch 8 not taken.
✓ Branch 13 taken 858 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 858 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 858 times.
✗ Branch 20 not taken.
|
3165 | return file.visit_dataset(_p, [&] <typename F> (F&& f) { return f.serialized(); }, _s.value()); |
| 419 | ✗ | return file.visit_dataset(_p, [&] <typename F> (F&& f) { return f.serialized(); }); | |
| 420 | 2543 | }; | |
| 421 | } | ||
| 422 | |||
| 423 | 10697 | bool _is_transient() const { | |
| 424 | 10697 | return static_cast<bool>(_num_steps); | |
| 425 | } | ||
| 426 | |||
| 427 | 9565 | const HDF5File& _access_file() const { | |
| 428 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 5761 times.
|
9565 | if (!_file.has_value()) |
| 429 | ✗ | throw InvalidState("No file has been read"); | |
| 430 | 9565 | return _file.value(); | |
| 431 | } | ||
| 432 | |||
| 433 | 1200 | std::vector<std::size_t> _number_of_all_piece_entities(const std::string& entity_type) const { | |
| 434 |
1/2✓ Branch 2 taken 742 times.
✗ Branch 3 not taken.
|
3600 | return _access_file().template read_dataset_to<std::vector<std::size_t>>("/VTKHDF/NumberOf" + entity_type, {{ |
| 435 |
1/2✓ Branch 1 taken 742 times.
✗ Branch 2 not taken.
|
1200 | .offset = {_get_part_offset()}, |
| 436 | 2400 | .count = {_number_of_current_pieces_in_file()} | |
| 437 |
1/2✓ Branch 1 taken 742 times.
✗ Branch 2 not taken.
|
2400 | }}); |
| 438 |
3/10✓ Branch 1 taken 742 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 742 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 742 times.
✗ Branch 8 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
4800 | } |
| 439 | |||
| 440 | template<std::integral T> | ||
| 441 | 594 | std::array<std::size_t, 2> _number_of_entities_and_offset_at_rank(T rank, const std::string& entity_type) const { | |
| 442 |
1/2✓ Branch 1 taken 380 times.
✗ Branch 2 not taken.
|
594 | const auto entities = _number_of_all_piece_entities(entity_type); |
| 443 |
1/2✓ Branch 1 taken 380 times.
✗ Branch 2 not taken.
|
1188 | return std::array{entities.at(rank), _accumulate_until(rank, entities)}; |
| 444 | 594 | } | |
| 445 | |||
| 446 | template<typename T> | ||
| 447 | 1484 | T _accumulate_until(std::integral auto rank, const std::vector<T>& values) const { | |
| 448 | 1484 | return std::accumulate(values.begin(), values.begin() + rank, T{0}); | |
| 449 | } | ||
| 450 | |||
| 451 | 273 | std::size_t _accumulate_over_pieces_until_step(std::size_t step, std::size_t count_per_piece) const { | |
| 452 |
2/2✓ Branch 0 taken 25 times.
✓ Branch 1 taken 58 times.
|
273 | if (step == 0) |
| 453 | 83 | return 0; | |
| 454 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 58 times.
|
190 | if (!_is_transient()) |
| 455 | ✗ | throw InvalidState("Step data only available in transient files"); | |
| 456 | |||
| 457 | 190 | std::size_t result = 0; | |
| 458 |
2/4✓ Branch 1 taken 58 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 58 times.
✗ Branch 5 not taken.
|
862 | std::ranges::for_each(std::views::iota(std::size_t{0}, step), [&] (std::size_t step_idx) { |
| 459 | 484 | const auto num_step_pieces = _number_of_pieces_in_file_at_step(step_idx); | |
| 460 | 484 | result += count_per_piece*num_step_pieces; | |
| 461 | }); | ||
| 462 | 190 | return result; | |
| 463 | } | ||
| 464 | |||
| 465 | Communicator _comm; | ||
| 466 | std::optional<HDF5File> _file; | ||
| 467 | std::size_t _num_cells = 0; | ||
| 468 | std::size_t _num_points = 0; | ||
| 469 | std::size_t _cell_offset = 0; | ||
| 470 | std::size_t _point_offset = 0; | ||
| 471 | std::optional<std::size_t> _num_steps; | ||
| 472 | std::optional<std::size_t> _step_index; | ||
| 473 | }; | ||
| 474 | |||
| 475 | } // namespace GridFormat | ||
| 476 | |||
| 477 | #endif // GRIDFORMAT_HAVE_HIGH_FIVE | ||
| 478 | #endif // GRIDFORMAT_VTK_HDF_UNSTRUCTURED_GRID_READER_HPP_ | ||
| 479 |