IOSS 2.0
Loading...
Searching...
No Matches
Ioss_Utils.h
Go to the documentation of this file.
1// Copyright(C) 1999-2025 National Technology & Engineering Solutions
2// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
3// NTESS, the U.S. Government retains certain rights in this software.
4//
5// See packages/seacas/LICENSE for details
6
7#pragma once
8
9#include "Ioss_CodeTypes.h"
11#include "Ioss_EntityType.h"
12#include "Ioss_Field.h"
13#include "Ioss_Property.h"
14#include "Ioss_Sort.h"
15#include <algorithm> // for sort, lower_bound, copy, etc
16#include <cassert>
17#include <cmath>
18#include <cstddef> // for size_t
19#include <cstdint> // for int64_t
20#include <cstdlib> // for nullptrr
21#include <iostream> // for ostringstream, etcstream, etc
22#include <stdexcept> // for runtime_error
23#include <string> // for string
24#include <vector> // for vector
25
26#include "ioss_export.h"
27
28namespace Ioss {
29 class DatabaseIO;
30 class Field;
31 class GroupingEntity;
32 class Region;
33 class SideBlock;
34 class PropertyManager;
35 enum class ElementShape : unsigned int;
36} // namespace Ioss
37
38[[noreturn]] inline void IOSS_ERROR(const std::string &errmsg) { throw std::runtime_error(errmsg); }
39
40[[noreturn]] inline void IOSS_ERROR(const std::ostringstream &errmsg) { IOSS_ERROR(errmsg.str()); }
41
42[[noreturn]] inline void IOSS_ABORT(const std::string &errmsg)
43{
44 std::cerr << "ERROR: " << errmsg << "\n";
45#if defined(SEACAS_HAVE_MPI)
46 int parallelSize = 1;
47 MPI_Comm_size(MPI_COMM_WORLD, &parallelSize); // CHECK: ALLOW MPI_COMM_WORLD
48 if (parallelSize > 1) {
49 MPI_Abort(MPI_COMM_WORLD, 1); // CHECK: ALLOW MPI_COMM_WORLD
50 // MPI_Abort should not return, but if it does, we throw the exception...
51 // This helps quiet the compiler also.
52 }
53#endif
54 exit(EXIT_FAILURE);
55}
56
57[[noreturn]] inline void IOSS_ABORT(const std::ostringstream &errmsg) { IOSS_ABORT(errmsg.str()); }
58
59// We have been relying on the assumption that calling `.data()` on an empty vector
60// will return `nullptr`. However, according to cppreference (based on the standard):
61//
62// `If size() is 0, data() may or may not return a null pointer.`
63//
64// We don't have any systems on which we have found that (yet?), but this is proactive
65// in removing our use of `.data()` on potentially empty vectors...
66template <typename T> IOSS_NODISCARD constexpr T *Data(std::vector<T> &vec)
67{
68 if (vec.empty()) {
69 return nullptr;
70 }
71 return vec.data();
72}
73
74template <typename T> IOSS_NODISCARD constexpr const T *Data(const std::vector<T> &vec)
75{
76 if (vec.empty()) {
77 return nullptr;
78 }
79 return vec.data();
80}
81
82template <typename T, size_t N> IOSS_NODISCARD constexpr T *Data(std::array<T, N> &arr)
83{
84 return N == 0 ? nullptr : arr.data();
85}
86
87template <typename T, size_t N> IOSS_NODISCARD constexpr const T *Data(const std::array<T, N> &arr)
88{
89 return N == 0 ? nullptr : arr.data();
90}
91
92namespace Ioss {
93 /* \brief Utility methods.
94 */
95 class IOSS_EXPORT Utils
96 {
97 static std::ostream
98 *m_outputStream; ///< general informational output (very rare). Default std::cerr
99 static std::ostream *m_debugStream; ///< debug output when requested. Default std::cerr
100 static std::ostream *m_warningStream; ///< IOSS warning output. Default std::cerr
101 static std::string m_preWarningText; ///< is a string that prepends all warning message output.
102 ///< Default is "\nIOSS WARNING: "
103 public:
104 /**
105 * \defgroup IossStreams Streams used for IOSS output
106 *@{
107 */
108 /** \brief set the stream for all streams (output, debug, and warning) to the specified
109 * `out_stream`
110 */
111 static void set_all_streams(std::ostream &out_stream);
112
113 /** \brief get the debug stream.
114 */
115 IOSS_NODISCARD static std::ostream &get_debug_stream();
116
117 /** \brief get the warning stream.
118 */
119 IOSS_NODISCARD static std::ostream &get_warning_stream();
120
121 /** \brief get the output stream.
122 */
123 IOSS_NODISCARD static std::ostream &get_output_stream();
124
125 IOSS_NODISCARD static std::string &get_warning_text() { return m_preWarningText; }
126
127 /** \brief set the output stream to the specified `output_stream`
128 */
129 static void set_output_stream(std::ostream &output_stream);
130
131 /** \brief set the debug stream to the specified `debug_stream`
132 */
133 static void set_debug_stream(std::ostream &debug_stream);
134
135 /** \brief set the warning stream to the specified `warning_stream`
136 */
137 static void set_warning_stream(std::ostream &warning_stream);
138
139 /** \brief set the pre-warning text
140 * Sets the text output prior to a warning to the specified text.
141 * Pass an empty string to disable this. Default is `"\nIOSS WARNING: "`
142 */
143 static void set_pre_warning_text(const std::string &text) { m_preWarningText = text; }
144 /** @}*/
145
146 static void copyright(std::ostream &out, const std::string &year_range);
147
148 IOSS_NODISCARD static bool check_valid_change_set_name(const std::string &cs_name,
149 const Ioss::Region &region,
150 int rank = 0);
151
152 static void check_dynamic_cast(const void *ptr)
153 {
154 if (ptr == nullptr) {
155 std::ostringstream errmsg;
156 errmsg << "INTERNAL ERROR: Invalid dynamic cast returned nullptr\n";
157 IOSS_ERROR(errmsg);
158 }
159 }
160
161 // NOTE: This code previously checked for existence of filesystem include, but
162 // gcc-8.X has the include but needs a library, also intel and clang
163 // pretend to be gcc, so macro to test for usability of filesystem
164 // was complicated and we can easily get by with the following code.
165 static bool is_path_absolute(const std::string &path)
166 {
167 if (!path.empty()) {
168#ifdef __IOSS_WINDOWS__
169 return path[0] == '\\' && path[1] == ':';
170#else
171 return path[0] == '/';
172#endif
173 }
174 return false;
175 }
176
177 /** \brief guess file type from extension */
178 IOSS_NODISCARD static std::string get_type_from_file(const std::string &filename);
179
180 template <typename T> static void uniquify(std::vector<T> &vec, bool skip_first = false)
181 {
182 auto it = vec.begin();
183 if (skip_first) {
184 it++;
185 }
186 Ioss::sort(it, vec.end());
187 vec.resize(unique(vec, skip_first));
188 vec.shrink_to_fit();
189 }
190
191 template <typename T> static void generate_index(std::vector<T> &index)
192 {
193 T sum = 0;
194 for (size_t i = 0; i < index.size() - 1; i++) {
195 T cnt = index[i];
196 index[i] = sum;
197 sum += cnt;
198 }
199 index.back() = sum;
200 }
201
202 template <typename T>
203 IOSS_NODISCARD static T find_index_location(T node, const std::vector<T> &index)
204 {
205 // 0-based node numbering
206 // index[p] = first node (0-based) on processor p
207
208#if 1
209 // Assume data coherence. I.e., a new search will be close to the
210 // previous search.
211 static size_t prev = 1;
212
213 size_t nproc = index.size();
214 if (prev < nproc && index[prev - 1] <= node && index[prev] > node) {
215 return prev - 1;
216 }
217
218 for (size_t p = 1; p < nproc; p++) {
219 if (index[p] > node) {
220 prev = p;
221 return p - 1;
222 }
223 }
224 std::ostringstream errmsg;
225 errmsg << "FATAL ERROR: find_index_location. Searching for " << node << " in:\n";
226 for (auto idx : index) {
227 errmsg << idx << ", ";
228 }
229 errmsg << "\n";
230 IOSS_ERROR(errmsg);
231#else
232 return std::distance(index.begin(), std::upper_bound(index.begin(), index.end(), node)) - 1;
233#endif
234 }
235
236 static void copy_string(char *dest, char const *source, size_t elements);
237
238 static void copy_string(char *dest, const std::string &source, size_t elements)
239 {
240 copy_string(dest, source.c_str(), elements);
241 }
242
243 template <size_t size> static void copy_string(char (&output)[size], const std::string &source)
244 {
245 copy_string(output, source.c_str(), size);
246 }
247
248 template <size_t size> static void copy_string(char (&output)[size], const char *source)
249 {
250 // Copy the string don't copy too many bytes.
251 copy_string(output, source, size);
252 }
253
254 template <typename T> static void clear(std::vector<T> &vec)
255 {
256 vec.clear();
257 vec.shrink_to_fit();
258 assert(vec.capacity() == 0);
259 }
260
261 /**
262 * Returns the number of digits required to print the number.
263 * If `use_commas` is specified, then the width will be adjusted
264 * to account for the comma used every 3 digits.
265 * (1,234,567,890 would return 13)
266 * Typically used with the `fmt::print()` functions as:
267 * ```
268 * fmt::print("{:{}}", number, number_width(number,true))
269 * fmt::print("{:{}d}", number, number_width(number,false))
270 * ```
271 */
272 IOSS_NODISCARD static constexpr int number_width(const size_t number, bool use_commas = false)
273 {
274 if (number == 0) {
275 return 1;
276 }
277 int width = static_cast<int>(std::floor(std::log10(number))) + 1;
278 if (use_commas) {
279 width += ((width - 1) / 3);
280 }
281 return width;
282 }
283
284 IOSS_NODISCARD static constexpr int power_2(int count)
285 {
286 // Return the power of two which is equal to or greater than `count`
287 // count = 15 -> returns 16
288 // count = 16 -> returns 16
289 // count = 17 -> returns 32
290
291 // Use brute force...
292 int pow2 = 1;
293 while (pow2 < count) {
294 pow2 *= 2;
295 }
296 return pow2;
297 }
298
299 template <typename T>
300 IOSS_NODISCARD static bool check_block_order(IOSS_MAYBE_UNUSED const std::vector<T *> &blocks)
301 {
302#ifndef NDEBUG
303 // Verify that element blocks are defined in sorted offset order...
304 typename std::vector<T *>::const_iterator I;
305
306 int64_t eb_offset = -1;
307 for (I = blocks.begin(); I != blocks.end(); ++I) {
308 int64_t this_off = (*I)->get_offset();
309 if (this_off < eb_offset) {
310 {
311 {
312 return false;
313 }
314 }
315 }
316 eb_offset = this_off;
317 }
318#endif
319 return true;
320 }
321
322 IOSS_NODISCARD static int term_width();
323
324 IOSS_NODISCARD static int log_power_2(uint64_t value);
325
326 /** \brief Get formatted time and date strings.
327 *
328 * Fill time_string and date_string with current time and date
329 * formatted as "HH:MM:SS" for time and "yy/mm/dd" or "yyyy/mm/dd"
330 * for date.
331 *
332 * \param[out] time_string The formatted time string.
333 * \param[out] date_string The formatted date string.
334 * \param[in] length Use 8 for short-year date format, or 10 for long-year date format.
335 */
336 static void time_and_date(char *time_string, char *date_string, size_t length);
337
338 IOSS_NODISCARD static std::string decode_filename(const std::string &filename, int processor,
339 int num_processors);
340 IOSS_NODISCARD static int get_number(const std::string &suffix);
341 IOSS_NODISCARD static int extract_id(const std::string &name_id);
342 IOSS_NODISCARD static std::string encode_entity_name(const std::string &entity_type,
343 int64_t id);
344
345 /** Return the trailing digits (if any) from `name`
346 * `hex20` would return the string `20`
347 * `tetra` would return an empty string.
348 */
349 IOSS_NODISCARD static std::string get_trailing_digits(const std::string &name);
350
351 /** \brief create a string that describes the list of input `ids` collapsing ranges if possible.
352 *
353 * Traverse the sorted input vector `ids` and return a string that has all sequential ranges
354 * collapsed and separated by `rng_sep` and all individual ids or ranges separated by `seq_sep`.
355 * Will throw an exception if `ids` is not sorted. An empty list returns an empty string.
356 * The sequence of ids `1, 2, 3, 5, 6, 7` with `rng_sep=".."` will return the default
357 * string `1..3, 5..8`
358 */
359 IOSS_NODISCARD static std::string format_id_list(const std::vector<size_t> &ids,
360 const std::string &rng_sep = " to ",
361 const std::string &seq_sep = ", ");
362
363 /** \brief Convert a string to lower case, and convert spaces to `_`.
364 *
365 * The conversion is performed in place.
366 *
367 * \param[in,out] name On input, the string to convert. On output, the converted string.
368 *
369 */
370 static void fixup_name(char *name);
371
372 /** \brief Convert a string to lower case, and convert spaces to `_`.
373 *
374 * The conversion is performed in place.
375 *
376 * \param[in,out] name On input, the string to convert. On output, the converted string.
377 *
378 */
379 static void fixup_name(std::string &name);
380
381 /** \brief Check whether property `prop_name` exists and if so, set `prop_value`
382 *
383 * based on the property value. Either "TRUE", "YES", "ON", or nonzero for true;
384 * or "FALSE", "NO", "OFF", or 0 for false.
385 * \param[in] properties the Ioss::PropertyManager containing the properties to be checked.
386 * \param[in] prop_name the name of the property to check whether it exists and if so, set its
387 * value.
388 * \param[out] prop_value if `prop_name` exists and has a valid value, set prop_value
389 * accordingly. Does not modify if `prop_name` does not exist. \returns true/false depending on
390 * whether property found and value set.
391 */
392
393 static bool check_set_bool_property(const Ioss::PropertyManager &properties,
394 const std::string &prop_name, bool &prop_value);
395
396 /** \brief Determine whether an entity has the property `omitted`.
397 *
398 * \param[in] block The entity.
399 * \returns True if the entity has the property `omitted`.
400 */
401 IOSS_NODISCARD static bool block_is_omitted(Ioss::GroupingEntity *block);
402
403 /** \brief Process the base element type `base` which has
404 * `nodes_per_element` nodes and a spatial dimension of `spatial`
405 * into a form that the IO system can (hopefully) recognize.
406 *
407 * Lowercases the name; converts spaces to `_`, adds
408 * nodes_per_element at end of name (if not already there), and
409 * does some other transformations to remove some exodusII ambiguity.
410 *
411 * \param[in] base The element base name.
412 * \param[in] nodes_per_element The number of nodes per element.
413 * \param[in] spatial The spatial dimension of the element.
414 * \returns The Ioss-formatted element name.
415 */
416 IOSS_NODISCARD static std::string fixup_type(const std::string &base, int nodes_per_element,
417 int spatial);
418
419 /** \brief Uppercase the first letter of the string
420 *
421 * \param[in] name The string to convert.
422 * \returns The converted string.
423 */
424 IOSS_NODISCARD static std::string capitalize(std::string name);
425
426 /** \brief Convert a string to upper case.
427 *
428 * \param[in] name The string to convert.
429 * \returns The converted string.
430 */
431 IOSS_NODISCARD static std::string uppercase(std::string name);
432
433 /** \brief Convert a string to lower case.
434 *
435 * \param[in] name The string to convert.
436 * \returns The converted string.
437 */
438 IOSS_NODISCARD static std::string lowercase(std::string name);
439
440 static void check_non_null(void *ptr, const char *type, const std::string &name,
441 const std::string &func);
442
443 /** \brief Case-insensitive string comparison.
444 *
445 * \param[in] s1 First string
446 * \param[in] s2 Second string
447 * \returns `true` if strings are equal
448 */
449 IOSS_NODISCARD static bool str_equal(const std::string &s1, const std::string &s2);
450
451 /** \brief Case-insensitive substring comparison.
452 *
453 * \param[in] prefix The prefix that should start the string
454 * \param[in] str The string which should begin with prefix
455 * \returns `true` if `str` begins with `prefix` or `prefix` is empty
456 */
457 IOSS_NODISCARD static bool substr_equal(const std::string &prefix, const std::string &str);
458
459 /** Check all values in `data` to make sure that if they are converted to a double and
460 * back again, there will be no data loss. This requires that the value be less than 2^53.
461 * This is done in the exodus database since it stores all transient data as doubles...
462 */
463 static bool check_int_to_real_overflow(const Ioss::Field &field, int64_t *data,
464 size_t num_entity);
465
466 /** \brief Get a string containing `uname` output.
467 *
468 * This output contains information about the current computing platform.
469 * This is used as information data in the created results file to help
470 * in tracking when/where/... the file was created.
471 *
472 * \returns The platform information string.
473 */
474 IOSS_NODISCARD static std::string platform_information();
475
476 /** \brief Get a filename relative to the specified working directory (if any)
477 * of the current execution.
478 *
479 * Working_directory must end with `/` or be empty.
480 *
481 * \param[in] relative_filename The file path to be appended to the working directory path.
482 * \param[in] type The file type. "generated" file types are treated differently.
483 * \param[in] working_directory the path to which the relative_filename path is appended.
484 * \returns The full path (working_directory + relative_filename)
485 */
486 IOSS_NODISCARD static std::string local_filename(const std::string &relative_filename,
487 const std::string &type,
488 const std::string &working_directory);
489
490 static void get_fields(int64_t entity_count, Ioss::NameList &names,
491 Ioss::Field::RoleType fld_role, const DatabaseIO *db, int *local_truth,
492 std::vector<Ioss::Field> &fields);
493
494 static int field_warning(const Ioss::GroupingEntity *ge, const Ioss::Field &field,
495 std::string_view inout);
496
497 static void calculate_sideblock_membership(IntVector &face_is_member, const SideBlock *sb,
498 size_t int_byte_size, const void *element,
499 const void *sides, int64_t number_sides,
500 const Region *region);
501
502 /** \brief Get the appropriate index offset for the sides of elements in a SideBlock.
503 *
504 * And yet another idiosyncrasy of sidesets...
505 * The side of an element (especially shells) can be
506 * either a face or an edge in the same sideset. The
507 * ordinal of an edge is (local_edge_number+numfaces) on the
508 * database, but needs to be (local_edge_number) for Sierra...
509 *
510 * If the sideblock has a "parent_element_topology" and a
511 * "topology", then we can determine whether to offset the
512 * side ordinals...
513 *
514 * \param[in] sb Compute the offset for element sides in this SideBlock
515 * \returns The offset.
516 */
517 IOSS_NODISCARD static int64_t get_side_offset(const Ioss::SideBlock *sb);
518
519 IOSS_NODISCARD static int64_t get_side_offset(const Ioss::ElementTopology *parent_topo,
520 const Ioss::ElementTopology *side_topo);
521
522 IOSS_NODISCARD static unsigned int hash(const std::string &name);
523
524 IOSS_NODISCARD static double timer();
525
526 /** \brief Convert an input file to a vector of strings containing one string for each line of
527 * the file.
528 *
529 * Should only be called by a single processor or each processor will be accessing the file
530 * at the same time...
531 *
532 * \param[in] file_name The name of the file.
533 * \param[out] lines The vector of strings containing the lines of the file
534 * \param[in] max_line_length The maximum number of characters in any line of the file.
535 */
536 static void input_file(const std::string &file_name, Ioss::NameList *lines,
537 size_t max_line_length = 0);
538
539 template <class T> IOSS_NODISCARD static std::string to_string(const T &t)
540 {
541 return std::to_string(t);
542 }
543
544 //! \brief Tries to shorten long variable names to an acceptable
545 //! length, and converts to lowercase and spaces to `_`
546 //!
547 //! Many databases have a maximum length for variable names which can
548 //! cause a problem with variable name length.
549 //!
550
551 //! This routine tries to shorten long variable names to an
552 //! acceptable length (`max_var_len` characters max). If the name
553 //! is already less than this length, it is returned unchanged...
554 //!
555 //! Since there is a (good) chance that two shortened names will match,
556 //! a 2-letter `hash` code is appended to the end of the variable name.
557 //!
558 //! So, we shorten the name to a maximum of `max_var_len`-3
559 //! characters and append a 2 character hash+separator.
560 //!
561 //! It also converts name to lowercase and converts spaces to `_`
562 IOSS_NODISCARD static std::string variable_name_kluge(const std::string &name,
563 size_t component_count, size_t copies,
564 size_t max_var_len);
565
566 IOSS_NODISCARD static std::string shape_to_string(const Ioss::ElementShape &shape);
567
568 IOSS_NODISCARD static std::string entity_type_to_string(const Ioss::EntityType &type);
569
570 /** \brief Create a nominal mesh for use in history databases.
571 *
572 * The model for a history file is a single sphere element (1 node, 1 element).
573 * This is needed for some applications that read this file that require a
574 * "mesh" even though a history file is just a collection of global variables
575 * with no real mesh. This routine will add the mesh portion to a history file.
576 *
577 * \param[in,out] region The region on which the nominal mesh is to be defined.
578 */
579 static void generate_history_mesh(Ioss::Region *region);
580
581 static void info_fields(const Ioss::GroupingEntity *ige, Ioss::Field::RoleType role,
582 const std::string &header, const std::string &suffix = "\n\t",
583 bool detail = false);
584
585 static void info_property(const Ioss::GroupingEntity *ige, Ioss::Property::Origin origin,
586 const std::string &header, const std::string &suffix = "\n\t",
587 bool print_empty = false);
588
590 {
591 dest.insert(dest.end(), src.begin(), src.end());
592 std::sort(dest.begin(), dest.end(), std::less<>());
593 auto endIter = std::unique(dest.begin(), dest.end());
594 dest.resize(endIter - dest.begin());
595 }
596
597 private:
598 // SEE: http://lemire.me/blog/2017/04/10/removing-duplicates-from-lists-quickly
599 template <typename T> static size_t unique(std::vector<T> &out, bool skip_first)
600 {
601 if (out.empty()) {
602 return 0;
603 }
604 size_t i = 1;
605 size_t pos = 1;
606 T oldv = out[0];
607 if (skip_first) {
608 i = 2;
609 pos = 2;
610 oldv = out[1];
611 }
612 for (; i < out.size(); ++i) {
613 T newv = out[i];
614 out[pos] = newv;
615 pos += (newv != oldv);
616 oldv = newv;
617 }
618 return pos;
619 }
620 };
621
622 inline std::ostream &OUTPUT() { return Utils::get_output_stream(); }
623
624 inline std::ostream &DebugOut() { return Utils::get_debug_stream(); }
625
626 inline std::ostream &WarnOut(bool output_prewarning = true)
627 {
628 if (output_prewarning) {
630 }
632 }
633
634} // namespace Ioss
#define IOSS_MAYBE_UNUSED
Definition Ioss_CodeTypes.h:55
#define IOSS_NODISCARD
Definition Ioss_CodeTypes.h:56
IOSS_NODISCARD constexpr T * Data(std::vector< T > &vec)
Definition Ioss_Utils.h:66
void IOSS_ERROR(const std::string &errmsg)
Definition Ioss_Utils.h:38
void IOSS_ABORT(const std::string &errmsg)
Definition Ioss_Utils.h:42
An input or output Database.
Definition Ioss_DatabaseIO.h:63
Represents an element topology.
Definition Ioss_ElementTopology.h:68
Holds metadata for bulk data associated with a GroupingEntity.
Definition Ioss_Field.h:28
RoleType
Definition Ioss_Field.h:72
Base class for all 'grouping' entities. The following derived classes are typical:
Definition Ioss_GroupingEntity.h:67
A collection of Ioss::Property objects.
Definition Ioss_PropertyManager.h:36
Origin
Definition Ioss_Property.h:30
A grouping entity that contains other grouping entities.
Definition Ioss_Region.h:93
A collection of element sides having the same topology.
Definition Ioss_SideBlock.h:37
Definition Ioss_Utils.h:96
static IOSS_NODISCARD std::string to_string(const T &t)
Definition Ioss_Utils.h:539
static void insert_sort_and_unique(const Ioss::NameList &src, Ioss::NameList &dest)
Definition Ioss_Utils.h:589
static std::ostream * m_debugStream
debug output when requested. Default std::cerr
Definition Ioss_Utils.h:99
static std::ostream * m_outputStream
general informational output (very rare). Default std::cerr
Definition Ioss_Utils.h:98
static void clear(std::vector< T > &vec)
Definition Ioss_Utils.h:254
static void copy_string(char *dest, char const *source, size_t elements)
Definition Ioss_Utils.C:1293
static IOSS_NODISCARD constexpr int power_2(int count)
Definition Ioss_Utils.h:284
static void copy_string(char(&output)[size], const char *source)
Definition Ioss_Utils.h:248
static void check_dynamic_cast(const void *ptr)
Definition Ioss_Utils.h:152
static bool is_path_absolute(const std::string &path)
Definition Ioss_Utils.h:165
static IOSS_NODISCARD constexpr int number_width(const size_t number, bool use_commas=false)
Definition Ioss_Utils.h:272
static void uniquify(std::vector< T > &vec, bool skip_first=false)
Definition Ioss_Utils.h:180
static std::string m_preWarningText
Definition Ioss_Utils.h:101
static void generate_index(std::vector< T > &index)
Definition Ioss_Utils.h:191
static std::ostream * m_warningStream
IOSS warning output. Default std::cerr.
Definition Ioss_Utils.h:100
static IOSS_NODISCARD bool check_block_order(IOSS_MAYBE_UNUSED const std::vector< T * > &blocks)
Definition Ioss_Utils.h:300
static size_t unique(std::vector< T > &out, bool skip_first)
Definition Ioss_Utils.h:599
static void copy_string(char(&output)[size], const std::string &source)
Definition Ioss_Utils.h:243
static IOSS_NODISCARD T find_index_location(T node, const std::vector< T > &index)
Definition Ioss_Utils.h:203
static void copy_string(char *dest, const std::string &source, size_t elements)
Definition Ioss_Utils.h:238
static void set_pre_warning_text(const std::string &text)
set the pre-warning text Sets the text output prior to a warning to the specified text....
Definition Ioss_Utils.h:143
static IOSS_NODISCARD std::string & get_warning_text()
Definition Ioss_Utils.h:125
static IOSS_NODISCARD std::ostream & get_warning_stream()
get the warning stream.
Definition Ioss_Utils.C:157
static IOSS_NODISCARD std::ostream & get_output_stream()
get the output stream.
Definition Ioss_Utils.C:155
static void set_all_streams(std::ostream &out_stream)
set the stream for all streams (output, debug, and warning) to the specified out_stream
Definition Ioss_Utils.C:142
static IOSS_NODISCARD std::ostream & get_debug_stream()
get the debug stream.
Definition Ioss_Utils.C:159
The main namespace for the Ioss library.
Definition Ioad_DatabaseIO.C:40
std::ostream & WarnOut(bool output_prewarning=true)
Definition Ioss_Utils.h:626
std::ostream & OUTPUT()
Definition Ioss_Utils.h:622
void sort(Iter begin, Iter end, Comp compare)
Definition Ioss_Sort.h:17
ElementShape
Definition Ioss_ElementTopology.h:24
std::ostream & DebugOut()
Definition Ioss_Utils.h:624
std::vector< int > IntVector
Definition Ioss_CodeTypes.h:21
Ioss::NameList NameList
Definition Ioss_ChangeSetFactory.h:25
EntityType
The particular type of GroupingEntity.
Definition Ioss_EntityType.h:12