GCC Code Coverage Report


Directory: gridformat/
File: gridformat/grid/writer.hpp
Date: 2026-10-18 00:09:19
Exec Total Coverage
Lines: 160 164 97.6%
Functions: 3410 3529 96.6%
Branches: 395 993 39.8%

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 Grid
6 * \brief Base classes for grid data writers.
7 */
8 #ifndef GRIDFORMAT_GRID_WRITER_HPP_
9 #define GRIDFORMAT_GRID_WRITER_HPP_
10
11 #include <array>
12 #include <string>
13 #include <utility>
14 #include <ranges>
15 #include <ostream>
16 #include <concepts>
17 #include <type_traits>
18
19 #include <gridformat/parallel/communication.hpp>
20 #include <gridformat/common/type_traits.hpp>
21 #include <gridformat/common/precision.hpp>
22 #include <gridformat/common/concepts.hpp>
23 #include <gridformat/common/field_storage.hpp>
24 #include <gridformat/common/range_field.hpp>
25 #include <gridformat/common/scalar_field.hpp>
26 #include <gridformat/common/logging.hpp>
27 #include <gridformat/common/output_file.hpp>
28
29 #include <gridformat/grid/grid.hpp>
30 #include <gridformat/grid/_detail.hpp>
31 #include <gridformat/grid/entity_fields.hpp>
32
33 namespace GridFormat {
34 namespace Traits {
35
36 //! Can be specialized by writers in case the file format does not contain connectivity information
37 template<typename Writer> struct WritesConnectivity : public std::true_type {};
38
39 //! Can be specialized by parallel writers to expose their underlying communicator
40 template<typename Writer>
41 struct CommunicatorAccess {
42 211 static constexpr auto get(const Writer&) { return NullCommunicator{}; }
43 };
44
45 //! Default specialization for writers that have a communicator() function
46 template<typename Writer>
47 requires( requires(const Writer& w) { { w.communicator() }; } )
48 struct CommunicatorAccess<Writer> {
49 476 static constexpr Concepts::Communicator decltype(auto) get(const Writer& w) {
50 476 return w.communicator();
51 }
52 };
53
54 } // namespace Traits
55
56 //! \addtogroup Grid
57 //! \{
58
59 //! Options that writer implementations can pass to the base class.
60 struct WriterOptions {
61 bool use_structured_grid_ordering; //!< Use row-major structured grid ordering
62 bool append_null_terminator_to_strings; //!< If true, '\0' is appended to string meta data
63
64 35126 bool operator==(const WriterOptions& other) const {
65 35126 return use_structured_grid_ordering == other.use_structured_grid_ordering
66
2/4
✓ Branch 0 taken 35126 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 35126 times.
✗ Branch 3 not taken.
35126 && append_null_terminator_to_strings == other.append_null_terminator_to_strings;
67 }
68 };
69
70 //! Base class for all writer implementations.
71 template<typename G>
72 class GridWriterBase {
73 public:
74 using Grid = G;
75 using Field = typename FieldStorage::Field;
76 using FieldPtr = typename FieldStorage::FieldPtr;
77
78 84295 explicit GridWriterBase(const Grid& grid, std::optional<WriterOptions> opts)
79 84295 : _grid(grid)
80 84295 , _opts{std::move(opts)}
81 84295 {}
82
83 //! Set the meta data with the given name from the values in the given range.
84 //! \note The VTK formats write ranges of `char` as strings, which is lossy for values that contain zeros.
85 //! \note In parallel writes, meta data is typically assumed to be the same on all ranks.
86 //! \note Ranges must be moved in. To write a range without transferring ownership, pass a view,
87 //! e.g. `std::views::all(range)`. Strings, string literals and scalars are copied.
88 template<std::ranges::range R>
89 14028 void set_meta_data(const std::string& name, R&& range) {
90 static_assert(
91 !std::is_array_v<std::remove_cvref_t<R>>,
92 "Built-in arrays are not supported, please use std::array (e.g. via std::to_array)"
93 );
94 static_assert(
95 !std::is_lvalue_reference_v<R>,
96 "Cannot take ranges by reference, please move or pass a view (e.g. std::views::all) "
97 "to data that outlives the writer"
98 );
99
1/2
✓ Branch 3 taken 7121 times.
✗ Branch 4 not taken.
14028 _meta_data.set(name, RangeField{std::move(range)});
100 14028 }
101
102 template<std::size_t N>
103 13975 void set_meta_data(const std::string& name, const char (&text)[N]) {
104
1/2
✓ Branch 3 taken 7097 times.
✗ Branch 4 not taken.
13975 _meta_data.set(name, RangeField{std::to_array(text)});
105 13975 }
106
107 14010 void set_meta_data(const std::string& name, std::string text) {
108
3/6
✓ Branch 1 taken 7120 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7120 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 7120 times.
✗ Branch 7 not taken.
14010 if (_opts && _opts.value().append_null_terminator_to_strings)
109 14010 text.push_back('\0');
110
1/2
✓ Branch 3 taken 7120 times.
✗ Branch 4 not taken.
14010 _meta_data.set(name, RangeField{std::move(text)});
111 14010 }
112
113 template<Concepts::Scalar T>
114 53 void set_meta_data(const std::string& name, T value) {
115
1/2
✓ Branch 2 taken 53 times.
✗ Branch 3 not taken.
53 _meta_data.set(name, ScalarField{value});
116 53 }
117
118 template<std::derived_from<Field> F>
119 13974 void set_meta_data(const std::string& name, F&& field) {
120 static_assert(!std::is_lvalue_reference_v<F>, "Cannot take metadata fields by reference, please move");
121
2/4
✓ Branch 2 taken 7096 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7096 times.
✗ Branch 6 not taken.
13974 set_meta_data(name, make_field_ptr(std::move(field)));
122 13974 }
123
124 62363 void set_meta_data(const std::string& name, FieldPtr ptr) {
125
1/2
✓ Branch 2 taken 32126 times.
✗ Branch 3 not taken.
62363 _meta_data.set(name, ptr);
126 62363 }
127
128 6 FieldPtr remove_meta_data(const std::string& name) {
129 6 return _meta_data.pop(name);
130 }
131
132 template<Concepts::PointFunction<Grid> F, Concepts::Scalar T = GridDetail::PointFunctionScalarType<Grid, F>>
133 82954 void set_point_field(const std::string& name, F&& point_function, const Precision<T>& prec = {}) {
134 static_assert(!std::is_lvalue_reference_v<F>, "Cannot take functions by reference, please move");
135
2/4
✓ Branch 2 taken 41496 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 41496 times.
✗ Branch 6 not taken.
82954 set_point_field(name, _make_point_field(std::move(point_function), prec));
136 82954 }
137
138 template<std::derived_from<Field> F>
139 83126 void set_point_field(const std::string& name, F&& field) {
140 static_assert(!std::is_lvalue_reference_v<F>, "Cannot take fields by reference, please move");
141
2/4
✓ Branch 2 taken 41582 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 41582 times.
✗ Branch 6 not taken.
83126 set_point_field(name, make_field_ptr(std::forward<F>(field)));
142 83126 }
143
144 154933 void set_point_field(const std::string& name, FieldPtr field_ptr) {
145
1/2
✓ Branch 3 taken 78739 times.
✗ Branch 4 not taken.
154933 _point_fields.set(name, std::move(field_ptr));
146 154933 }
147
148 3 FieldPtr remove_point_field(const std::string& name) {
149 3 return _point_fields.pop(name);
150 }
151
152 template<Concepts::CellFunction<Grid> F, Concepts::Scalar T = GridDetail::CellFunctionScalarType<Grid, F>>
153 82790 void set_cell_field(const std::string& name, F&& cell_function, const Precision<T>& prec = {}) {
154 static_assert(!std::is_lvalue_reference_v<F>, "Cannot take functions by reference, please move");
155
2/4
✓ Branch 2 taken 41423 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 41423 times.
✗ Branch 6 not taken.
82790 set_cell_field(name, _make_cell_field(std::move(cell_function), prec));
156 82790 }
157
158 template<std::derived_from<Field> F>
159 82962 void set_cell_field(const std::string& name, F&& field) {
160 static_assert(!std::is_lvalue_reference_v<F>, "Cannot take fields by reference, please move");
161
2/4
✓ Branch 2 taken 41509 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 41509 times.
✗ Branch 6 not taken.
82962 set_cell_field(name, make_field_ptr(std::forward<F>(field)));
162 82962 }
163
164 154559 void set_cell_field(const std::string& name, FieldPtr field_ptr) {
165
1/2
✓ Branch 2 taken 78554 times.
✗ Branch 3 not taken.
154559 _cell_fields.set(name, field_ptr);
166 154559 }
167
168 3 FieldPtr remove_cell_field(const std::string& name) {
169 3 return _cell_fields.pop(name);
170 }
171
172 936 void clear() {
173 936 _meta_data.clear();
174 936 _point_fields.clear();
175 936 _cell_fields.clear();
176 936 }
177
178 void set_ignore_warnings(bool value) {
179 _ignore_warnings = value;
180 }
181
182 818199 const Grid& grid() const {
183 818199 return _grid;
184 }
185
186 208569 const std::optional<WriterOptions>& writer_options() const {
187 208569 return _opts;
188 }
189
190 template<typename Writer>
191 70153 void copy_fields(Writer& w) const {
192
1/2
✗ Branch 3 not taken.
✓ Branch 4 taken 35126 times.
70153 if (_opts.has_value() != w.writer_options().has_value())
193 ✗ throw TypeError("Cannot copy fields into writers with different options");
194
3/6
✓ Branch 1 taken 35126 times.
✗ Branch 2 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 35126 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 35126 times.
70153 if (_opts.has_value() && writer_options().value() != w.writer_options().value())
195 ✗ throw TypeError("Cannot copy fields into writers with different options");
196
197
12/16
✓ Branch 1 taken 35126 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 35126 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 35126 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 24474 times.
✗ Branch 11 not taken.
✓ Branch 15 taken 23826 times.
✓ Branch 16 taken 648 times.
✓ Branch 17 taken 165 times.
✓ Branch 18 taken 58783 times.
✓ Branch 19 taken 20 times.
✓ Branch 20 taken 23826 times.
✓ Branch 21 taken 34973 times.
✓ Branch 22 taken 4 times.
166433 for (const auto& [name, field_ptr] : meta_data_fields(*this))
198
2/3
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 24458 times.
✗ Branch 3 not taken.
48772 w.set_meta_data(name, field_ptr);
199
12/16
✓ Branch 1 taken 35126 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 35126 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 35126 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 36119 times.
✗ Branch 11 not taken.
✓ Branch 15 taken 35330 times.
✓ Branch 16 taken 789 times.
✓ Branch 17 taken 162 times.
✓ Branch 18 taken 70290 times.
✓ Branch 19 taken 8 times.
✓ Branch 20 taken 35330 times.
✓ Branch 21 taken 34964 times.
✓ Branch 22 taken 4 times.
212591 for (const auto& [name, field_ptr] : point_fields(*this))
200
2/3
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 36115 times.
✗ Branch 3 not taken.
72004 w.set_point_field(name, field_ptr);
201
12/16
✓ Branch 1 taken 35126 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 35126 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 35126 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 36076 times.
✗ Branch 11 not taken.
✓ Branch 15 taken 35287 times.
✓ Branch 16 taken 789 times.
✓ Branch 17 taken 162 times.
✓ Branch 18 taken 70247 times.
✓ Branch 19 taken 8 times.
✓ Branch 20 taken 35287 times.
✓ Branch 21 taken 34964 times.
✓ Branch 22 taken 4 times.
212479 for (const auto& [name, field_ptr] : cell_fields(*this))
202
2/3
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 36072 times.
✗ Branch 3 not taken.
71948 w.set_cell_field(name, field_ptr);
203 70153 }
204
205 //! Return a range over the fields with the given rank (0=scalars, 1=vectors, 2=tensors)
206 friend Concepts::RangeOf<std::pair<std::string, FieldPtr>> auto
207 114783 point_fields_of_rank(unsigned int rank, const GridWriterBase& writer) {
208
1/2
✓ Branch 1 taken 58695 times.
✗ Branch 2 not taken.
114783 return writer._point_field_names()
209
2/4
✓ Branch 1 taken 58695 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 58695 times.
✗ Branch 5 not taken.
440084 | std::views::filter([&, r=rank] (const std::string& n) {
210
144/288
✓ Branch 1 taken 53074 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 53074 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 53074 times.
✗ Branch 8 not taken.
✓ Branch 12 taken 153572 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 153572 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 153572 times.
✗ Branch 19 not taken.
✓ Branch 23 taken 5112 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 5112 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 5112 times.
✗ Branch 30 not taken.
✓ Branch 34 taken 1122 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1122 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1122 times.
✗ Branch 41 not taken.
✓ Branch 45 taken 1158 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1158 times.
✗ Branch 49 not taken.
✓ Branch 51 taken 1158 times.
✗ Branch 52 not taken.
✓ Branch 56 taken 798 times.
✗ Branch 57 not taken.
✓ Branch 59 taken 798 times.
✗ Branch 60 not taken.
✓ Branch 62 taken 798 times.
✗ Branch 63 not taken.
✓ Branch 67 taken 798 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 798 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 798 times.
✗ Branch 74 not taken.
✓ Branch 78 taken 798 times.
✗ Branch 79 not taken.
✓ Branch 81 taken 798 times.
✗ Branch 82 not taken.
✓ Branch 84 taken 798 times.
✗ Branch 85 not taken.
✓ Branch 89 taken 366 times.
✗ Branch 90 not taken.
✓ Branch 92 taken 366 times.
✗ Branch 93 not taken.
✓ Branch 95 taken 366 times.
✗ Branch 96 not taken.
✓ Branch 100 taken 372 times.
✗ Branch 101 not taken.
✓ Branch 103 taken 372 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 372 times.
✗ Branch 107 not taken.
✓ Branch 111 taken 372 times.
✗ Branch 112 not taken.
✓ Branch 114 taken 372 times.
✗ Branch 115 not taken.
✓ Branch 117 taken 372 times.
✗ Branch 118 not taken.
✓ Branch 122 taken 12 times.
✗ Branch 123 not taken.
✓ Branch 125 taken 12 times.
✗ Branch 126 not taken.
✓ Branch 128 taken 12 times.
✗ Branch 129 not taken.
✓ Branch 133 taken 6 times.
✗ Branch 134 not taken.
✓ Branch 136 taken 6 times.
✗ Branch 137 not taken.
✓ Branch 139 taken 6 times.
✗ Branch 140 not taken.
✓ Branch 144 taken 6 times.
✗ Branch 145 not taken.
✓ Branch 147 taken 6 times.
✗ Branch 148 not taken.
✓ Branch 150 taken 6 times.
✗ Branch 151 not taken.
✓ Branch 155 taken 6 times.
✗ Branch 156 not taken.
✓ Branch 158 taken 6 times.
✗ Branch 159 not taken.
✓ Branch 161 taken 6 times.
✗ Branch 162 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 177 taken 6 times.
✗ Branch 178 not taken.
✓ Branch 180 taken 6 times.
✗ Branch 181 not taken.
✓ Branch 183 taken 6 times.
✗ Branch 184 not taken.
✓ Branch 188 taken 6 times.
✗ Branch 189 not taken.
✓ Branch 191 taken 6 times.
✗ Branch 192 not taken.
✓ Branch 194 taken 6 times.
✗ Branch 195 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 210 taken 6 times.
✗ Branch 211 not taken.
✓ Branch 213 taken 6 times.
✗ Branch 214 not taken.
✓ Branch 216 taken 6 times.
✗ Branch 217 not taken.
✓ Branch 221 taken 6 times.
✗ Branch 222 not taken.
✓ Branch 224 taken 6 times.
✗ Branch 225 not taken.
✓ Branch 227 taken 6 times.
✗ Branch 228 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 243 taken 6 times.
✗ Branch 244 not taken.
✓ Branch 246 taken 6 times.
✗ Branch 247 not taken.
✓ Branch 249 taken 6 times.
✗ Branch 250 not taken.
✓ Branch 254 taken 6 times.
✗ Branch 255 not taken.
✓ Branch 257 taken 6 times.
✗ Branch 258 not taken.
✓ Branch 260 taken 6 times.
✗ Branch 261 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 276 taken 6 times.
✗ Branch 277 not taken.
✓ Branch 279 taken 6 times.
✗ Branch 280 not taken.
✓ Branch 282 taken 6 times.
✗ Branch 283 not taken.
✓ Branch 287 taken 6 times.
✗ Branch 288 not taken.
✓ Branch 290 taken 6 times.
✗ Branch 291 not taken.
✓ Branch 293 taken 6 times.
✗ Branch 294 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 309 taken 6 times.
✗ Branch 310 not taken.
✓ Branch 312 taken 6 times.
✗ Branch 313 not taken.
✓ Branch 315 taken 6 times.
✗ Branch 316 not taken.
✓ Branch 320 taken 6 times.
✗ Branch 321 not taken.
✓ Branch 323 taken 6 times.
✗ Branch 324 not taken.
✓ Branch 326 taken 6 times.
✗ Branch 327 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 342 taken 6 times.
✗ Branch 343 not taken.
✓ Branch 345 taken 6 times.
✗ Branch 346 not taken.
✓ Branch 348 taken 6 times.
✗ Branch 349 not taken.
✓ Branch 353 taken 6 times.
✗ Branch 354 not taken.
✓ Branch 356 taken 6 times.
✗ Branch 357 not taken.
✓ Branch 359 taken 6 times.
✗ Branch 360 not taken.
✓ Branch 364 taken 6 times.
✗ Branch 365 not taken.
✓ Branch 367 taken 6 times.
✗ Branch 368 not taken.
✓ Branch 370 taken 6 times.
✗ Branch 371 not taken.
✓ Branch 375 taken 6 times.
✗ Branch 376 not taken.
✓ Branch 378 taken 6 times.
✗ Branch 379 not taken.
✓ Branch 381 taken 6 times.
✗ Branch 382 not taken.
✓ Branch 386 taken 6 times.
✗ Branch 387 not taken.
✓ Branch 389 taken 6 times.
✗ Branch 390 not taken.
✓ Branch 392 taken 6 times.
✗ Branch 393 not taken.
✓ Branch 397 taken 6 times.
✗ Branch 398 not taken.
✓ Branch 400 taken 6 times.
✗ Branch 401 not taken.
✓ Branch 403 taken 6 times.
✗ Branch 404 not taken.
✓ Branch 408 taken 6 times.
✗ Branch 409 not taken.
✓ Branch 411 taken 6 times.
✗ Branch 412 not taken.
✓ Branch 414 taken 6 times.
✗ Branch 415 not taken.
✓ Branch 419 taken 6 times.
✗ Branch 420 not taken.
✓ Branch 422 taken 6 times.
✗ Branch 423 not taken.
✓ Branch 425 taken 6 times.
✗ Branch 426 not taken.
✓ Branch 430 taken 6 times.
✗ Branch 431 not taken.
✓ Branch 433 taken 6 times.
✗ Branch 434 not taken.
✓ Branch 436 taken 6 times.
✗ Branch 437 not taken.
✓ Branch 441 taken 6 times.
✗ Branch 442 not taken.
✓ Branch 444 taken 6 times.
✗ Branch 445 not taken.
✓ Branch 447 taken 6 times.
✗ Branch 448 not taken.
✓ Branch 452 taken 6 times.
✗ Branch 453 not taken.
✓ Branch 455 taken 6 times.
✗ Branch 456 not taken.
✓ Branch 458 taken 6 times.
✗ Branch 459 not taken.
✓ Branch 463 taken 6 times.
✗ Branch 464 not taken.
✓ Branch 466 taken 6 times.
✗ Branch 467 not taken.
✓ Branch 469 taken 6 times.
✗ Branch 470 not taken.
✓ Branch 474 taken 6 times.
✗ Branch 475 not taken.
✓ Branch 477 taken 6 times.
✗ Branch 478 not taken.
✓ Branch 480 taken 6 times.
✗ Branch 481 not taken.
✓ Branch 485 taken 6 times.
✗ Branch 486 not taken.
✓ Branch 488 taken 6 times.
✗ Branch 489 not taken.
✓ Branch 491 taken 6 times.
✗ Branch 492 not taken.
✓ Branch 496 taken 6 times.
✗ Branch 497 not taken.
✓ Branch 499 taken 6 times.
✗ Branch 500 not taken.
✓ Branch 502 taken 6 times.
✗ Branch 503 not taken.
✓ Branch 507 taken 6 times.
✗ Branch 508 not taken.
✓ Branch 510 taken 6 times.
✗ Branch 511 not taken.
✓ Branch 513 taken 6 times.
✗ Branch 514 not taken.
✓ Branch 518 taken 6 times.
✗ Branch 519 not taken.
✓ Branch 521 taken 6 times.
✗ Branch 522 not taken.
✓ Branch 524 taken 6 times.
✗ Branch 525 not taken.
217770 return writer._get_point_field(n).layout().dimension() - 1 == r;
211 })
212
1/2
✓ Branch 1 taken 58695 times.
✗ Branch 2 not taken.
386506 | std::views::transform([&] (std::string n) {
213
48/96
✓ Branch 1 taken 39418 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 114534 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3828 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 836 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 856 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 586 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 586 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 586 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 274 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 278 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 278 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 8 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 4 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 4 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 4 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 4 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 4 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 4 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 4 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 4 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 4 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 4 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 4 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 4 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 4 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 4 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 4 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 4 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 4 times.
✗ Branch 86 not taken.
✓ Branch 88 taken 4 times.
✗ Branch 89 not taken.
✓ Branch 91 taken 4 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 4 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 4 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 4 times.
✗ Branch 101 not taken.
✓ Branch 103 taken 4 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 4 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 4 times.
✗ Branch 110 not taken.
✓ Branch 112 taken 4 times.
✗ Branch 113 not taken.
✓ Branch 115 taken 4 times.
✗ Branch 116 not taken.
✓ Branch 118 taken 4 times.
✗ Branch 119 not taken.
✓ Branch 121 taken 4 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 4 times.
✗ Branch 125 not taken.
✓ Branch 127 taken 4 times.
✗ Branch 128 not taken.
✓ Branch 130 taken 4 times.
✗ Branch 131 not taken.
✓ Branch 133 taken 4 times.
✗ Branch 134 not taken.
✓ Branch 136 taken 4 times.
✗ Branch 137 not taken.
✓ Branch 139 taken 4 times.
✗ Branch 140 not taken.
✓ Branch 142 taken 4 times.
✗ Branch 143 not taken.
162212 auto field_ptr = writer._get_point_field_ptr(n);
214 324424 return std::make_pair(std::move(n), std::move(field_ptr));
215
1/2
✓ Branch 1 taken 58695 times.
✗ Branch 2 not taken.
391778 });
216 }
217
218 //! Return a range over the fields with the given rank (0=scalars, 1=vectors, 2=tensors)
219 friend Concepts::RangeOf<std::pair<std::string, FieldPtr>> auto
220 114783 cell_fields_of_rank(unsigned int rank, const GridWriterBase& writer) {
221
1/2
✓ Branch 1 taken 58695 times.
✗ Branch 2 not taken.
114783 return writer._cell_field_names()
222
2/4
✓ Branch 1 taken 58695 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 58695 times.
✗ Branch 5 not taken.
439672 | std::views::filter([&, r=rank] (const std::string& n) {
223
69/288
✓ Branch 1 taken 52788 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 52788 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 52788 times.
✗ Branch 8 not taken.
✓ Branch 12 taken 153418 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 153418 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 153418 times.
✗ Branch 19 not taken.
✓ Branch 23 taken 5100 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 5100 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 5100 times.
✗ Branch 30 not taken.
✓ Branch 34 taken 1110 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1110 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1110 times.
✗ Branch 41 not taken.
✓ Branch 45 taken 1164 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1164 times.
✗ Branch 49 not taken.
✓ Branch 51 taken 1164 times.
✗ Branch 52 not taken.
✓ Branch 56 taken 804 times.
✗ Branch 57 not taken.
✓ Branch 59 taken 804 times.
✗ Branch 60 not taken.
✓ Branch 62 taken 804 times.
✗ Branch 63 not taken.
✓ Branch 67 taken 810 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 810 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 810 times.
✗ Branch 74 not taken.
✓ Branch 78 taken 804 times.
✗ Branch 79 not taken.
✓ Branch 81 taken 804 times.
✗ Branch 82 not taken.
✓ Branch 84 taken 804 times.
✗ Branch 85 not taken.
✓ Branch 89 taken 360 times.
✗ Branch 90 not taken.
✓ Branch 92 taken 360 times.
✗ Branch 93 not taken.
✓ Branch 95 taken 360 times.
✗ Branch 96 not taken.
✓ Branch 100 taken 372 times.
✗ Branch 101 not taken.
✓ Branch 103 taken 372 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 372 times.
✗ Branch 107 not taken.
✓ Branch 111 taken 360 times.
✗ Branch 112 not taken.
✓ Branch 114 taken 360 times.
✗ Branch 115 not taken.
✓ Branch 117 taken 360 times.
✗ Branch 118 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✓ Branch 133 taken 6 times.
✗ Branch 134 not taken.
✓ Branch 136 taken 6 times.
✗ Branch 137 not taken.
✓ Branch 139 taken 6 times.
✗ Branch 140 not taken.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 155 not taken.
✗ Branch 156 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 161 not taken.
✗ Branch 162 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 177 not taken.
✗ Branch 178 not taken.
✗ Branch 180 not taken.
✗ Branch 181 not taken.
✗ Branch 183 not taken.
✗ Branch 184 not taken.
✗ Branch 188 not taken.
✗ Branch 189 not taken.
✗ Branch 191 not taken.
✗ Branch 192 not taken.
✗ Branch 194 not taken.
✗ Branch 195 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 210 not taken.
✗ Branch 211 not taken.
✗ Branch 213 not taken.
✗ Branch 214 not taken.
✗ Branch 216 not taken.
✗ Branch 217 not taken.
✗ Branch 221 not taken.
✗ Branch 222 not taken.
✗ Branch 224 not taken.
✗ Branch 225 not taken.
✗ Branch 227 not taken.
✗ Branch 228 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 243 not taken.
✗ Branch 244 not taken.
✗ Branch 246 not taken.
✗ Branch 247 not taken.
✗ Branch 249 not taken.
✗ Branch 250 not taken.
✗ Branch 254 not taken.
✗ Branch 255 not taken.
✗ Branch 257 not taken.
✗ Branch 258 not taken.
✗ Branch 260 not taken.
✗ Branch 261 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 276 not taken.
✗ Branch 277 not taken.
✗ Branch 279 not taken.
✗ Branch 280 not taken.
✗ Branch 282 not taken.
✗ Branch 283 not taken.
✗ Branch 287 not taken.
✗ Branch 288 not taken.
✗ Branch 290 not taken.
✗ Branch 291 not taken.
✗ Branch 293 not taken.
✗ Branch 294 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 309 not taken.
✗ Branch 310 not taken.
✗ Branch 312 not taken.
✗ Branch 313 not taken.
✗ Branch 315 not taken.
✗ Branch 316 not taken.
✗ Branch 320 not taken.
✗ Branch 321 not taken.
✗ Branch 323 not taken.
✗ Branch 324 not taken.
✗ Branch 326 not taken.
✗ Branch 327 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 342 not taken.
✗ Branch 343 not taken.
✗ Branch 345 not taken.
✗ Branch 346 not taken.
✗ Branch 348 not taken.
✗ Branch 349 not taken.
✗ Branch 353 not taken.
✗ Branch 354 not taken.
✗ Branch 356 not taken.
✗ Branch 357 not taken.
✗ Branch 359 not taken.
✗ Branch 360 not taken.
✓ Branch 364 taken 6 times.
✗ Branch 365 not taken.
✓ Branch 367 taken 6 times.
✗ Branch 368 not taken.
✓ Branch 370 taken 6 times.
✗ Branch 371 not taken.
✗ Branch 375 not taken.
✗ Branch 376 not taken.
✗ Branch 378 not taken.
✗ Branch 379 not taken.
✗ Branch 381 not taken.
✗ Branch 382 not taken.
✗ Branch 386 not taken.
✗ Branch 387 not taken.
✗ Branch 389 not taken.
✗ Branch 390 not taken.
✗ Branch 392 not taken.
✗ Branch 393 not taken.
✓ Branch 397 taken 6 times.
✗ Branch 398 not taken.
✓ Branch 400 taken 6 times.
✗ Branch 401 not taken.
✓ Branch 403 taken 6 times.
✗ Branch 404 not taken.
✗ Branch 408 not taken.
✗ Branch 409 not taken.
✗ Branch 411 not taken.
✗ Branch 412 not taken.
✗ Branch 414 not taken.
✗ Branch 415 not taken.
✗ Branch 419 not taken.
✗ Branch 420 not taken.
✗ Branch 422 not taken.
✗ Branch 423 not taken.
✗ Branch 425 not taken.
✗ Branch 426 not taken.
✓ Branch 430 taken 6 times.
✗ Branch 431 not taken.
✓ Branch 433 taken 6 times.
✗ Branch 434 not taken.
✓ Branch 436 taken 6 times.
✗ Branch 437 not taken.
✗ Branch 441 not taken.
✗ Branch 442 not taken.
✗ Branch 444 not taken.
✗ Branch 445 not taken.
✗ Branch 447 not taken.
✗ Branch 448 not taken.
✗ Branch 452 not taken.
✗ Branch 453 not taken.
✗ Branch 455 not taken.
✗ Branch 456 not taken.
✗ Branch 458 not taken.
✗ Branch 459 not taken.
✓ Branch 463 taken 6 times.
✗ Branch 464 not taken.
✓ Branch 466 taken 6 times.
✗ Branch 467 not taken.
✓ Branch 469 taken 6 times.
✗ Branch 470 not taken.
✗ Branch 474 not taken.
✗ Branch 475 not taken.
✗ Branch 477 not taken.
✗ Branch 478 not taken.
✗ Branch 480 not taken.
✗ Branch 481 not taken.
✗ Branch 485 not taken.
✗ Branch 486 not taken.
✗ Branch 488 not taken.
✗ Branch 489 not taken.
✗ Branch 491 not taken.
✗ Branch 492 not taken.
✓ Branch 496 taken 6 times.
✗ Branch 497 not taken.
✓ Branch 499 taken 6 times.
✗ Branch 500 not taken.
✓ Branch 502 taken 6 times.
✗ Branch 503 not taken.
✗ Branch 507 not taken.
✗ Branch 508 not taken.
✗ Branch 510 not taken.
✗ Branch 511 not taken.
✗ Branch 513 not taken.
✗ Branch 514 not taken.
✗ Branch 518 not taken.
✗ Branch 519 not taken.
✗ Branch 521 not taken.
✗ Branch 522 not taken.
✗ Branch 524 not taken.
✗ Branch 525 not taken.
217162 return writer._get_cell_field(n).layout().dimension() - 1 == r;
224 })
225
1/2
✓ Branch 1 taken 58695 times.
✗ Branch 2 not taken.
386230 | std::views::transform([&] (std::string n) {
226
23/96
✓ Branch 1 taken 39244 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 114460 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3820 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 830 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 852 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 582 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 586 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 582 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 270 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 278 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 270 times.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✓ Branch 37 taken 4 times.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 46 taken 4 times.
✗ Branch 47 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✓ Branch 55 taken 4 times.
✗ Branch 56 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 64 taken 4 times.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✓ Branch 73 taken 4 times.
✗ Branch 74 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✓ Branch 82 taken 4 times.
✗ Branch 83 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✓ Branch 91 taken 4 times.
✗ Branch 92 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✓ Branch 100 taken 4 times.
✗ Branch 101 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✓ Branch 109 taken 4 times.
✗ Branch 110 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✓ Branch 118 taken 4 times.
✗ Branch 119 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✓ Branch 127 taken 4 times.
✗ Branch 128 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 133 not taken.
✗ Branch 134 not taken.
✓ Branch 136 taken 4 times.
✗ Branch 137 not taken.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
161822 auto field_ptr = writer._get_cell_field_ptr(n);
227 323644 return std::make_pair(std::move(n), std::move(field_ptr));
228
1/2
✓ Branch 1 taken 58695 times.
✗ Branch 2 not taken.
391388 });
229 }
230
231 69746 friend Concepts::RangeOf<std::pair<std::string, FieldPtr>> auto point_fields(const GridWriterBase& writer) {
232
3/6
✓ Branch 1 taken 35298 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 35298 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 35298 times.
✗ Branch 8 not taken.
174438 return writer._point_field_names() | std::views::transform([&] (std::string n) {
233
4/18
✓ Branch 1 taken 29022 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8073 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
37101 auto field_ptr = writer._get_point_field_ptr(n);
234 74202 return std::make_pair(std::move(n), std::move(field_ptr));
235 176593 });
236 }
237
238 69740 friend Concepts::RangeOf<std::pair<std::string, FieldPtr>> auto cell_fields(const GridWriterBase& writer) {
239
3/6
✓ Branch 1 taken 35295 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 35295 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 35295 times.
✗ Branch 8 not taken.
174431 return writer._cell_field_names() | std::views::transform([&] (std::string n) {
240
4/18
✓ Branch 1 taken 28984 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8086 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
37076 auto field_ptr = writer._get_cell_field_ptr(n);
241 74152 return std::make_pair(std::move(n), std::move(field_ptr));
242 176556 });
243 }
244
245 69986 friend Concepts::RangeOf<std::pair<std::string, FieldPtr>> auto meta_data_fields(const GridWriterBase& writer) {
246
3/6
✓ Branch 1 taken 35454 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 35454 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 35454 times.
✗ Branch 8 not taken.
163612 return writer._meta_data_field_names() | std::views::transform([&] (std::string n) {
247
4/18
✓ Branch 1 taken 19983 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5768 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
25775 auto field_ptr = writer._get_meta_data_field_ptr(n);
248 51550 return std::make_pair(std::move(n), std::move(field_ptr));
249 165747 });
250 }
251
252 protected:
253 4 void _log_warning(std::string_view warning) const {
254
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
4 if (!_ignore_warnings)
255
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
4 log_warning(
256
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
8 std::string{warning}
257
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
12 + (warning.ends_with("\n") ? "" : "\n")
258
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
12 + "To deactivate this warning, call set_ignore_warnings(true);"
259 );
260 4 }
261
262 template<typename EntityFunction, Concepts::Scalar T>
263 82954 auto _make_point_field(EntityFunction&& f, const Precision<T>& prec) const {
264
1/2
✓ Branch 1 taken 41496 times.
✗ Branch 2 not taken.
82954 if (_opts.has_value())
265 82954 return PointField{_grid, std::move(f), _opts.value().use_structured_grid_ordering, prec};
266 ✗ return PointField{_grid, std::move(f), false, prec};
267 }
268
269 template<typename EntityFunction, Concepts::Scalar T>
270 82790 auto _make_cell_field(EntityFunction&& f, const Precision<T>& prec) const {
271
1/2
✓ Branch 1 taken 41423 times.
✗ Branch 2 not taken.
82790 if (_opts.has_value())
272 82790 return CellField{_grid, std::move(f), _opts.value().use_structured_grid_ordering, prec};
273 ✗ return CellField{_grid, std::move(f), false, prec};
274 }
275
276 206322 std::ranges::range auto _point_field_names() const {
277 206322 return _point_fields.field_names();
278 }
279
280 206719 std::ranges::range auto _cell_field_names() const {
281 206719 return _cell_fields.field_names();
282 }
283
284 451314 const Field& _get_point_field(const std::string& name) const {
285 451314 return _point_fields.get(name);
286 }
287
288 478129 FieldPtr _get_point_field_ptr(const std::string& name) const {
289 478129 return _point_fields.get_ptr(name);
290 }
291
292 450282 const Field& _get_cell_field(const std::string& name) const {
293 450282 return _cell_fields.get(name);
294 }
295
296 477017 FieldPtr _get_cell_field_ptr(const std::string& name) const {
297 477017 return _cell_fields.get_ptr(name);
298 }
299
300 86885 std::ranges::range auto _meta_data_field_names() const {
301 86885 return _meta_data.field_names();
302 }
303
304 56680 const Field& _get_meta_data_field(const std::string& name) const {
305 56680 return _meta_data.get(name);
306 }
307
308 50932 FieldPtr _get_meta_data_field_ptr(const std::string& name) const {
309 50932 return _meta_data.get_ptr(name);
310 }
311
312 private:
313 const Grid& _grid;
314 FieldStorage _point_fields;
315 FieldStorage _cell_fields;
316 FieldStorage _meta_data;
317 std::optional<WriterOptions> _opts;
318 bool _ignore_warnings = false;
319 };
320
321 //! Abstract base class for grid file writers.
322 template<typename Grid>
323 class GridWriter : public GridWriterBase<Grid> {
324 public:
325 85034 virtual ~GridWriter() = default;
326
327 227 GridWriter(GridWriter&&) = default;
328 GridWriter(const GridWriter&) = delete;
329 // not assignable since the grid is stored by reference
330 GridWriter& operator=(GridWriter&&) = delete;
331 GridWriter& operator=(const GridWriter&) = delete;
332
333 83912 explicit GridWriter(const Grid& grid, std::string extension, std::optional<WriterOptions> opts)
334 83912 : GridWriterBase<Grid>(grid, std::move(opts))
335 83912 , _extension(std::move(extension))
336 83912 {}
337
338 29447 std::string write(const std::string& filename) const {
339 29447 std::string filename_with_ext = filename + _extension;
340
2/2
✓ Branch 1 taken 13910 times.
✓ Branch 2 taken 1117 times.
29447 _write(filename_with_ext);
341 27264 return filename_with_ext;
342 2183 }
343
344 void write(std::ostream& s) const {
345 _write(s);
346 }
347
348 23 const std::string& extension() const {
349 23 return _extension;
350 }
351
352 private:
353 std::string _extension;
354
355 16191 virtual void _write(const std::string& filename_with_ext) const {
356
2/2
✓ Branch 1 taken 7661 times.
✓ Branch 2 taken 600 times.
24446 write_to(filename_with_ext, [&] (std::ostream& s) { _write(s); });
357 15005 }
358
359 virtual void _write(std::ostream&) const = 0;
360 };
361
362 //! Abstract base class for time series file writers.
363 template<typename Grid>
364 class TimeSeriesGridWriter : public GridWriterBase<Grid> {
365 public:
366 418 virtual ~TimeSeriesGridWriter() = default;
367
368 95 TimeSeriesGridWriter(TimeSeriesGridWriter&&) = default;
369 TimeSeriesGridWriter(const TimeSeriesGridWriter&) = delete;
370 // not assignable since the grid is stored by reference
371 TimeSeriesGridWriter& operator=(TimeSeriesGridWriter&&) = delete;
372 TimeSeriesGridWriter& operator=(const TimeSeriesGridWriter&) = delete;
373
374 271 explicit TimeSeriesGridWriter(const Grid& grid, std::optional<WriterOptions> opts)
375 271 : GridWriterBase<Grid>(grid, std::move(opts))
376 271 {}
377
378 667 std::string write(double t) {
379 667 std::string filename = _write(t);
380 662 _step_count++;
381 662 return filename;
382 }
383
384 protected:
385 unsigned _step_count = 0;
386
387 private:
388 virtual std::string _write(double) = 0;
389 };
390
391 #ifndef DOXYGEN
392 namespace GridDetail {
393
394 template<bool is_transient, typename G>
395 struct WriterBase;
396 template<typename G>
397 struct WriterBase<true, G> : std::type_identity<TimeSeriesGridWriter<G>> {};
398 template<typename G>
399 struct WriterBase<false, G> : std::type_identity<GridWriter<G>> {};
400
401 } // namespace GridDetail
402 #endif // DOXYGEN
403
404 //! \} group Grid
405
406 } // namespace GridFormat
407
408 #endif // GRIDFORMAT_GRID_WRITER_HPP_
409