libMesh
Loading...
Searching...
No Matches
exodusII_io_helper.h
Go to the documentation of this file.
1// The libMesh Finite Element Library.
2// Copyright (C) 2002-2026 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3
4// This library is free software; you can redistribute it and/or
5// modify it under the terms of the GNU Lesser General Public
6// License as published by the Free Software Foundation; either
7// version 2.1 of the License, or (at your option) any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12// Lesser General Public License for more details.
13
14// You should have received a copy of the GNU Lesser General Public
15// License along with this library; if not, write to the Free Software
16// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
18#ifndef LIBMESH_EXODUSII_IO_HELPER_H
19#define LIBMESH_EXODUSII_IO_HELPER_H
20
21#include "libmesh/libmesh_config.h"
22
23#ifdef LIBMESH_HAVE_EXODUS_API
24
25// Local includes
26#include "libmesh/parallel_object.h"
27#include "libmesh/point.h"
28#include "libmesh/boundary_info.h" // BoundaryInfo::BCTuple
29#include "libmesh/enum_elem_type.h" // INVALID_ELEM
30#include "libmesh/exodus_header_info.h"
31
32// C++ includes
33#include <iostream>
34#include <string>
35#include <vector>
36#include <map>
37
38// Macros to simplify checking Exodus error codes
39#define EX_CHECK_ERR(code, msg) \
40 do { \
41 if ((code) < 0) { \
42 libmesh_error_msg((msg)); \
43 } } while (0)
44
45#define EX_EXCEPTIONLESS_CHECK_ERR(code, msg) \
46 do { \
47 if ((code) < 0) { \
48 libMesh::err << (msg) << std::endl; \
49 libmesh_exceptionless_error(); \
50 } } while (0)
51
52// Before we include a header wrapped in a namespace, we'd better make
53// sure none of its dependencies end up in that namespace
54#include <errno.h>
55#include <stddef.h>
56#include <stdlib.h>
57#include <stdint.h>
58
59namespace libMesh
60{
61
62// Forward declarations
63class MeshBase;
64class DofObject;
65
75{
76public:
85 bool v=false,
86 bool run_only_on_proc0=true,
87 bool single_precision=false);
97
104
109 static int get_exodus_version();
110
117 const char * get_elem_type() const;
118
123 void set_add_sides(bool add_sides);
124
125 bool get_add_sides();
126
132 void open(const char * filename, bool read_only);
133
139
145
151 void read_qa_records();
152
158 void print_header();
159
164 void read_nodes();
165
170 void read_node_num_map();
171
176 void read_bex_cv_blocks();
177
181 void print_nodes(std::ostream & out_stream = libMesh::out);
182
187 void read_block_info();
188
192 int get_block_id(int index);
193
198 std::string get_block_name(int index);
199
203 int get_side_set_id(int index);
204
209 std::string get_side_set_name(int index);
210
214 int get_node_set_id(int index);
215
220 std::string get_node_set_name(int index);
221
226 void read_elem_in_block(int block);
227
231 void read_face_blocks();
232
237
242 void read_elem_num_map();
243
248 void read_sideset_info();
249
254 void read_nodeset_info();
255
260 void read_elemset_info();
261
266 void read_sideset(int id, int offset);
267
272 void read_elemset(int id, int offset);
273
279 void read_all_nodesets();
280
287 void close() noexcept;
288
292 void read_time_steps();
293
298 void read_num_time_steps();
299
304 void read_nodal_var_values(std::string nodal_var_name, int time_step);
305
310 void read_elemental_var_values(std::string elemental_var_name,
311 int time_step,
312 std::map<dof_id_type, Real> & elem_var_value_map);
313
320 dof_id_type get_libmesh_node_id(int exodus_node_id);
321 dof_id_type get_libmesh_elem_id(int exodus_elem_id);
322
332 MeshBase & mesh, Node * node, int zero_based_node_num_map_index);
334 MeshBase & mesh, Elem * elem, int zero_based_elem_num_map_index);
335
336private:
337
342 int exodus_id,
343 const std::vector<int> & num_map);
344
346 MeshBase & mesh,
347 DofObject * dof_object,
348 int exodus_mapped_id);
349
350public:
351
355 virtual void create(std::string filename);
356
360 virtual void initialize(std::string title, const MeshBase & mesh, bool use_discontinuous=false);
361
365 virtual void write_nodal_coordinates(const MeshBase & mesh, bool use_discontinuous=false);
366
381 virtual void write_elements(const MeshBase & mesh,
382 bool use_discontinuous=false);
383
387 virtual void write_sidesets(const MeshBase & mesh);
388
392 virtual void write_nodesets(const MeshBase & mesh);
393
397 virtual void initialize_element_variables(std::vector<std::string> names,
398 const std::vector<std::set<subdomain_id_type>> & vars_active_subdomains);
399
403 void initialize_nodal_variables(std::vector<std::string> names);
404
408 void initialize_global_variables(std::vector<std::string> names);
409
413 void write_timestep(int timestep, Real time);
414
418 void write_elemsets(const MeshBase & mesh);
419
423 void
425 int timestep,
426 const std::vector<std::string> & var_names,
427 const std::vector<std::set<boundary_id_type>> & side_ids,
428 const std::vector<std::map<BoundaryInfo::BCTuple, Real>> & bc_vals);
429
433 void
435 int timestep,
436 std::vector<std::string> & var_names,
437 std::vector<std::set<boundary_id_type>> & side_ids,
438 std::vector<std::map<BoundaryInfo::BCTuple, Real>> & bc_vals);
439
450 void
452 std::map<BoundaryInfo::BCTuple, unsigned int> & bc_array_indices);
453
457 void
458 write_nodeset_data (int timestep,
459 const std::vector<std::string> & var_names,
460 const std::vector<std::set<boundary_id_type>> & node_boundary_ids,
461 const std::vector<std::map<BoundaryInfo::NodeBCTuple, Real>> & bc_vals);
462
466 void
467 read_nodeset_data (int timestep,
468 std::vector<std::string> & var_names,
469 std::vector<std::set<boundary_id_type>> & node_boundary_ids,
470 std::vector<std::map<BoundaryInfo::NodeBCTuple, Real>> & bc_vals);
471
479 void
480 get_nodeset_data_indices (std::map<BoundaryInfo::NodeBCTuple, unsigned int> & bc_array_indices);
481
485 void
486 write_elemset_data (int timestep,
487 const std::vector<std::string> & var_names,
488 const std::vector<std::set<elemset_id_type>> & elemset_ids_in,
489 const std::vector<std::map<std::pair<dof_id_type, elemset_id_type>, Real>> & elemset_vals);
490
494 void
495 read_elemset_data (int timestep,
496 std::vector<std::string> & var_names,
497 std::vector<std::set<elemset_id_type>> & elemset_ids_in,
498 std::vector<std::map<std::pair<dof_id_type, elemset_id_type>, Real>> & elemset_vals);
499
507 void
508 get_elemset_data_indices (std::map<std::pair<dof_id_type, elemset_id_type>, unsigned int> & elemset_array_indices);
509
522 (const MeshBase & mesh,
523 const std::vector<Real> & values,
524 int timestep,
525 const std::vector<std::set<subdomain_id_type>> & vars_active_subdomains);
526
542 (const MeshBase & mesh,
543 const std::vector<Real> & values,
544 int timestep,
545 const std::vector<std::set<subdomain_id_type>> & vars_active_subdomains,
546 const std::vector<std::string> & derived_var_names,
547 const std::map<subdomain_id_type, std::vector<std::string>> & subdomain_to_var_names);
548
552 void write_nodal_values(int var_id, const std::vector<Real> & values, int timestep);
553
557 void write_information_records(const std::vector<std::string> & records);
558
562 void write_global_values(const std::vector<Real> & values, int timestep);
563
567 void update();
568
572 void read_global_values(std::vector<Real> & values, int timestep);
573
583
590 void set_hdf5_writing(bool write_hdf5);
591
604 void write_as_dimension(unsigned dim);
605
611
616 void set_max_name_length(unsigned int max_length);
617
624 std::vector<std::string>
625 get_complex_names(const std::vector<std::string> & names,
626 bool write_complex_abs) const;
627
632 std::vector<std::set<subdomain_id_type>>
634 (const std::vector<std::set<subdomain_id_type>> & vars_active_subdomains,
635 bool write_complex_abs) const;
636
644 std::map<subdomain_id_type, std::vector<std::string>>
646 (const std::map<subdomain_id_type, std::vector<std::string>> & subdomain_to_var_names,
647 bool write_complex_abs) const;
648
654 class Conversion;
655
661 class NamesData;
662
667 void message(std::string_view msg);
668
674 void message(std::string_view msg, int i);
675
676 // File identification flag
677 int ex_id;
678
679 // General error flag
681
682 // struct which contains data fields from the Exodus file header
684
685 // Problem title (Use vector<char> to emulate a char *)
686 std::vector<char> & title;
687
688 // Number of dimensions in the mesh
689 int & num_dim;
690
691 // Total number of nodes in the mesh
693
694 // Total number of elements in the mesh
695 int & num_elem;
696
697 // Smallest element id which exceeds every element id in the mesh.
698 // (this may exceed num_elem due to mapping)
699 int end_elem_id() const;
700
701 // Total number of element blocks
703
704 // Total number of edges
705 int & num_edge;
706
707 // Total number of edge blocks. The sum of the number of edges in
708 // each block must equal num_edge.
710
711 // Total number of faces
712 int & num_face;
713
714 // Total number of face blocks. The sum of the number of faces in
715 // each block must equal num_face.
717
718 // Total number of node sets
720
721 // Total number of side sets
723
724 // Total number of element sets
726
727 // Number of global variables
729
730 // Number of sideset variables
732
733 // Number of nodeset variables
735
736 // Number of elemset variables
738
739 // Number of elements in this block
741
742 // Number of nodes in each element
744
745 // Number of attributes for a given block
747
748 // Total number of elements in all side sets
750
751 // Total number of elements in all elem sets
753
754 // Vector of element block identification numbers
755 std::vector<int> block_ids;
756
757 // Vector of edge block identification numbers
758 std::vector<int> edge_block_ids;
759
760 // Vector of nodes in an element
761 std::vector<int> connect;
762
763 // For NSIDED element blocks, the number of nodes in each element
764 std::vector<int> elem_node_counts;
765
766 // For NFACED element blocks, the number of faces in each element
767 std::vector<int> elem_face_counts;
768
769 // For NFACED element blocks, the nodes in each Exodus face
770 std::vector<std::vector<int>> c0polyhedron_face_connect;
771
772 // Vector of the sideset IDs
773 std::vector<int> ss_ids;
774
775 // Vector of the nodeset IDs
776 std::vector<int> nodeset_ids;
777
778 // Vector of the elemset IDs
779 std::vector<int> elemset_ids;
780
781 // Number of sides in each sideset
782 std::vector<int> num_sides_per_set;
783
784 // Number of nodes in each nodeset
785 std::vector<int> num_nodes_per_set;
786
787 // Number of elems in each elemset
788 std::vector<int> num_elems_per_set;
789
790 // Number of distribution factors per sideset
791 std::vector<int> num_df_per_set;
792
793 // Number of distribution factors per nodeset
795
796 // Number of distribution factors per elemset
798
799 // Starting indices for each nodeset in the node_sets_node_list vector.
800 // Used in the calls to ex_{put,get}_concat_node_sets().
802
803 // Starting indices for each nodeset in the node_sets_dist_fact vector.
804 // Used in the calls to ex_{put,get}_concat_node_sets().
806
807 // Node ids for all nodes in nodesets, concatenated together.
808 // Used in the calls to ex_{put,get}_concat_node_sets().
810
811 // Distribution factors for all nodes in all nodesets, concatenated together.
812 // Used in the calls to ex_{put,get}_concat_node_sets().
814
815 // List of element numbers in all sidesets
816 std::vector<int> elem_list;
817
818 // Side (face/edge) number actually on the boundary
819 std::vector<int> side_list;
820
821 // Side (face/edge) id number
822 std::vector<int> id_list;
823
824 // List of element numbers in all elemsets
825 std::vector<int> elemset_list;
826
827 // List of elemset ids for all elements in elemsets
828 std::vector<int> elemset_id_list;
829
830 // Optional mapping from internal [0,num_nodes) to arbitrary indices
831 std::vector<int> node_num_map;
832
833 // Optional mapping from internal [0,num_elem) to arbitrary indices
834 std::vector<int> elem_num_map;
835
836 // x locations of node points
837 std::vector<Real> x;
838
839 // y locations of node points
840 std::vector<Real> y;
841
842 // z locations of node points
843 std::vector<Real> z;
844
845 // Spline weights associated with node points, in IGA meshes
846 std::vector<Real> w;
847
848 // Number of Bezier Extraction coefficient vectors in a block
849 unsigned int bex_num_elem_cvs;
850
851 // Bezier Extraction connectivity indices, in IGA meshes
852 std::vector<std::vector<long unsigned int>> bex_cv_conn;
853
854 // Bezier Extraction coefficient vectors, in IGA meshes
855 // bex_dense_constraint_vecs[block_num][vec_num][column_num] = coef
856 std::vector<std::vector<std::vector<Real>>> bex_dense_constraint_vecs;
857
858 // Type of element in a given block
859 std::vector<char> elem_type;
860
861 // Maps libMesh element numbers to Exodus element numbers
862 // gets filled in when write_elements gets called
865
866 // Map of all node numbers connected to local node numbers to their exodus numbering.
867 // The exodus numbers are stored in here starting with 1
870
871 // The number of timesteps in the file, as returned by ex_inquire
873
874 // The timesteps stored in the solution file, filled by read_time_steps()
876
877 // The number of nodal variables in the Exodus file
879
880 // The names of the nodal variables stored in the Exodus file
881 std::vector<std::string> nodal_var_names;
882
883 // Holds the nodal variable values for a given variable, one value
884 // per node, indexed by libMesh node id.
885 // This is a map so it can handle Nemesis files as well.
887
888 // The number of elemental variables in the Exodus file
890
891 // The names of the elemental variables stored in the Exodus file
892 std::vector<std::string> elem_var_names;
893
894 // Holds the elemental variable values for a given variable, one value per element
896
897 // The names of the global variables stored in the Exodus file
898 std::vector<std::string> global_var_names;
899
900 // The names of the sideset variables stored in the Exodus file
901 std::vector<std::string> sideset_var_names;
902
903 // The names of the nodeset variables stored in the Exodus file
904 std::vector<std::string> nodeset_var_names;
905
906 // The names of the elemset variables stored in the Exodus file
907 std::vector<std::string> elemset_var_names;
908
909 // Maps of Ids to named entities
910 std::map<int, std::string> id_to_block_names;
911 std::map<int, std::string> id_to_edge_block_names;
912 std::map<int, std::string> id_to_ss_names;
913 std::map<int, std::string> id_to_ns_names;
914 std::map<int, std::string> id_to_elemset_names;
915
916 // On/Off message flag
918
919 // Same as the ExodusII_IO flag by the same name. This flag is
920 // also set whenever ExodusII_IO::set_unique_ids_from_maps() is called.
922
923 // This flag gets set after the Exodus file has been successfully opened for writing.
924 // Both the create() and open() (if called with EX_WRITE) functions may set this flag.
926
927 // This flag gets set after the open() function has been successfully called.
928 // We call open() to open an ExodusII file for reading.
930
931 // When either create() or open() is called, the Helper stores the
932 // name of the opened file as current_filename. This way, the
933 // ExodusII_IO object can check to see if, on subsequent writes, the
934 // user is asking to write to a *different* filename from the one
935 // that is currently open, and signal an error. The current
936 // ExodusII_IO implementation is designed to work with a single file
937 // only, so if you want to write to multiple Exodus files, use a
938 // different ExodusII_IO object for each one.
940
952 void read_var_names(ExodusVarType type);
953
955 get_conversion(const ElemType type) const;
956
958 get_conversion(std::string type_str) const;
959
960 /*
961 * Returns the sum of node "offsets" that are to be expected from a
962 * parallel nodal solution vector that has had "fake" nodes added on
963 * each processor. This plus a node id gives a valid nodal solution
964 * vector index.
965 */
967 {
968 if (_added_side_node_offsets.empty())
969 return n;
970
971 // Find the processor id that has node_id in the parallel vec
972 const auto lb = std::upper_bound(_true_node_offsets.begin(),
973 _true_node_offsets.end(), n);
975 const processor_id_type p = lb - _true_node_offsets.begin();
976
977 return n + (p ? _added_side_node_offsets[p-1] : 0);
978 }
979
980 /*
981 * Returns the sum of both added node "offsets" on processors 0
982 * through p-1 and real nodes added on processors 0 to p.
983 * This is the starting index for added nodes' data.
984 */
986 {
988 const dof_id_type added_node_offsets =
989 (_added_side_node_offsets.empty() || !p) ? 0 :
991 return _true_node_offsets[p] + added_node_offsets;
992 }
993
994
995protected:
1000 void check_existing_vars(ExodusVarType type, std::vector<std::string> & names, std::vector<std::string> & names_from_file);
1001
1007 void write_var_names(ExodusVarType type, const std::vector<std::string> & names);
1008
1009 // If true, whenever there is an I/O operation, only perform if if we are on processor 0.
1011
1012 // This flag gets set after the create() function has been successfully called.
1014
1015 // True once the elem vars are initialized
1017
1018 // True once the global vars are initialized
1020
1021 // True once the nodal vars are initialized
1023
1024 // If true, use the Mesh's dimension (as determined by the dimension
1025 // of the elements comprising the mesh) instead of the mesh's
1026 // spatial dimension, when writing. By default this is false.
1028
1029 // If true, write an HDF5 file when available. If false, write the
1030 // old format.
1032
1033 // The maximum name length to use when writing
1034 unsigned int _max_name_length;
1035
1036 // Set once the elem num map has been read
1038
1039 // Use this for num_dim when writing the Exodus file. If non-zero, supersedes
1040 // any value set in _use_mesh_dimension_instead_of_spatial_dimension.
1042
1043 // On output, shift every point by _coordinate_offset
1045
1046 // If true, forces single precision I/O
1048
1055 std::vector<dof_id_type> _added_side_node_offsets;
1056
1062 std::vector<dof_id_type> _true_node_offsets;
1063
1074 {
1075 // If necessary, allocates space to store a version of vec_in in a
1076 // different precision than it was input with.
1077 MappedOutputVector(const std::vector<Real> & vec_in,
1078 bool single_precision_in);
1079
1081
1082 // Returns void * pointer to either the mapped data or the
1083 // original data, as necessary.
1084 void * data();
1085
1086 private:
1087 const std::vector<Real> & our_data;
1089 std::vector<double> double_vec;
1090 std::vector<float> float_vec;
1091 };
1092
1101 {
1102 MappedInputVector(std::vector<Real> & vec_in,
1103 bool single_precision_in);
1105
1106 // Returns void * pointer to either the mapped data or the
1107 // original data, as necessary.
1108 void * data();
1109
1110 private:
1111 std::vector<Real> & our_data;
1113 std::vector<double> double_vec;
1114 std::vector<float> float_vec;
1115 };
1116
1117
1118protected:
1119
1124 virtual void read_var_names_impl(const char * var_type,
1125 int & count,
1126 std::vector<std::string> & result);
1127
1128private:
1129
1133 bool _add_sides = false;
1134
1138 void write_var_names_impl(const char * var_type,
1139 int & count,
1140 const std::vector<std::string> & names);
1141
1146 std::map<std::string, ElemType> element_equivalence_map;
1148
1157 std::map<int, std::map<ElemType, ExodusII_IO_Helper::Conversion>> conversion_map;
1158 void init_conversion_map();
1159};
1160
1161
1162
1164{
1165public:
1166
1171 : node_map(nullptr),
1172 inverse_node_map(nullptr),
1173 side_map(nullptr),
1174 inverse_side_map(nullptr),
1175 shellface_map(nullptr),
1176 inverse_shellface_map(nullptr),
1179 dim(0),
1180 n_nodes(0),
1181 exodus_type("")
1182 {}
1183
1190 int get_node_map(int i) const;
1191
1202 int get_inverse_node_map(int i) const;
1203
1210 int get_side_map(int i) const;
1211
1218 int get_inverse_side_map(int i) const;
1219
1224 int get_shellface_map(int i) const;
1225
1229 int get_inverse_shellface_map(int i) const;
1230
1238
1242 std::string exodus_elem_type() const;
1243
1247 std::size_t get_shellface_index_offset() const;
1248
1253 static const int invalid_id;
1254
1258 const std::vector<int> * node_map;
1259
1265 const std::vector<int> * inverse_node_map;
1266
1270 const std::vector<int> * side_map;
1271
1275 const std::vector<int> * inverse_side_map;
1276
1282 const std::vector<int> * shellface_map;
1283
1287 const std::vector<int> * inverse_shellface_map;
1288
1295
1301
1306 int dim;
1307
1312
1316 std::string exodus_type;
1317};
1318
1319
1320
1327{
1328public:
1334 explicit
1335 NamesData(size_t n_strings, size_t string_length);
1336
1340 void push_back_entry(const std::string & name);
1341
1345 char ** get_char_star_star();
1346
1350 char * get_char_star(int i);
1351
1352private:
1353 // C++ data structures for managing string memory
1354 std::vector<std::vector<char>> data_table;
1355 std::vector<char *> data_table_pointers;
1356
1357 size_t counter;
1359};
1360
1361
1362inline void ExodusII_IO_Helper::set_add_sides(bool add_sides)
1363{
1364 _add_sides = add_sides;
1365}
1366
1367
1369{
1370 return _add_sides;
1371}
1372
1373
1375{
1376 libmesh_assert_equal_to(std::size_t(num_elem), elem_num_map.size());
1377 return _end_elem_id;
1378}
1379
1380
1381} // namespace libMesh
1382
1383#endif // LIBMESH_HAVE_EXODUS_API
1384
1385#endif // LIBMESH_EXODUSII_IO_HELPER_H
unsigned int dim
The BoundaryInfo class contains information relevant to boundary conditions including storing faces,...
The DofObject defines an abstract base class for objects that have degrees of freedom associated with...
Definition dof_object.h:55
This is the base class from which all geometric element types are derived.
Definition elem.h:96
This class is used as both an external data structure for passing around Exodus file header informati...
static const int invalid_id
An invalid_id that can be returned to signal failure in case something goes wrong.
size_t shellface_index_offset
The shellface index offset defines the offset due to a difference between libMesh and Exodus in index...
const std::vector< int > * inverse_side_map
Pointer to the inverse side map for this element.
const std::vector< int > * inverse_shellface_map
Pointer to the inverse shellface map for this element.
std::string exodus_type
The string corresponding to the Exodus type for this element.
int dim
The element dimension; useful since we don't seem to have a cheap way to look this up from ElemType.
const std::vector< int > * shellface_map
Pointer to the shellface map for this element.
const std::vector< int > * node_map
Pointer to the node map for this element.
const std::vector< int > * side_map
Pointer to the side map for this element.
const std::vector< int > * inverse_node_map
Pointer to the inverse node map for this element.
int n_nodes
The number of nodes per element; useful likewise.
This class is useful for managing anything that requires a char ** input/output in ExodusII file.
void push_back_entry(const std::string &name)
Adds another name to the current data table.
char * get_char_star(int i)
Provide access to the i'th underlying char *.
std::vector< std::vector< char > > data_table
char ** get_char_star_star()
Provide access to the underlying C data table.
This is the ExodusII_IO_Helper class.
void write_as_dimension(unsigned dim)
Sets the value of _write_as_dimension.
void read_nodeset_data(int timestep, std::vector< std::string > &var_names, std::vector< std::set< boundary_id_type > > &node_boundary_ids, std::vector< std::map< BoundaryInfo::NodeBCTuple, Real > > &bc_vals)
Read nodeset variables, if any, into the provided data structures.
void read_block_info()
Reads information for all of the blocks in the ExodusII mesh file.
void update()
Uses ex_update() to flush buffers to file.
void read_elemset_data(int timestep, std::vector< std::string > &var_names, std::vector< std::set< elemset_id_type > > &elemset_ids_in, std::vector< std::map< std::pair< dof_id_type, elemset_id_type >, Real > > &elemset_vals)
Read elemset variables, if any, into the provided data structures.
std::vector< int > exodus_node_num_to_libmesh
void write_var_names_impl(const char *var_type, int &count, const std::vector< std::string > &names)
write_var_names() dispatches to this function.
std::map< subdomain_id_type, std::vector< std::string > > get_complex_subdomain_to_var_names(const std::map< subdomain_id_type, std::vector< std::string > > &subdomain_to_var_names, bool write_complex_abs) const
Takes a map from subdomain id -> vector of active variable names as input and returns a corresponding...
void read_nodeset_info()
Reads information about all of the nodesets in the ExodusII mesh file.
void use_mesh_dimension_instead_of_spatial_dimension(bool val)
Sets the underlying value of the boolean flag _use_mesh_dimension_instead_of_spatial_dimension.
void write_sideset_data(const MeshBase &mesh, int timestep, const std::vector< std::string > &var_names, const std::vector< std::set< boundary_id_type > > &side_ids, const std::vector< std::map< BoundaryInfo::BCTuple, Real > > &bc_vals)
Write sideset data for the requested timestep.
virtual void write_nodal_coordinates(const MeshBase &mesh, bool use_discontinuous=false)
Writes the nodal coordinates contained in "mesh".
void read_node_num_map()
Reads the optional node_num_map from the ExodusII mesh file.
void read_time_steps()
Reads and stores the timesteps in the 'time_steps' array.
bool _add_sides
Set to true iff we want to write separate "side" elements too.
dof_id_type get_libmesh_id(int exodus_id, const std::vector< int > &num_map)
Internal implementation for the two sets of functions above.
std::vector< std::string > get_complex_names(const std::vector< std::string > &names, bool write_complex_abs) const
std::vector< std::string > nodal_var_names
void read_and_store_header_info()
Reads an ExodusII mesh file header, and stores required information on this object.
ExodusII_IO_Helper(const ExodusII_IO_Helper &)=default
Special functions.
ExodusHeaderInfo read_header() const
Reads an ExodusII mesh file header, leaving this object's internal data structures unchanged.
virtual void write_sidesets(const MeshBase &mesh)
Writes the sidesets contained in "mesh".
std::map< int, std::string > id_to_ns_names
void read_elemental_var_values(std::string elemental_var_name, int time_step, std::map< dof_id_type, Real > &elem_var_value_map)
Reads elemental values for the variable 'elemental_var_name' at the specified timestep into the 'elem...
std::vector< std::set< subdomain_id_type > > get_complex_vars_active_subdomains(const std::vector< std::set< subdomain_id_type > > &vars_active_subdomains, bool write_complex_abs) const
returns a "tripled" copy of vars_active_subdomains, which is necessary in the complex-valued case.
std::vector< int > num_elem_df_per_set
void write_elemset_data(int timestep, const std::vector< std::string > &var_names, const std::vector< std::set< elemset_id_type > > &elemset_ids_in, const std::vector< std::map< std::pair< dof_id_type, elemset_id_type >, Real > > &elemset_vals)
Write elemset data for the requested timestep.
int get_node_set_id(int index)
Get the node set id for the given node set index.
std::map< dof_id_type, Real > nodal_var_values
void write_nodeset_data(int timestep, const std::vector< std::string > &var_names, const std::vector< std::set< boundary_id_type > > &node_boundary_ids, const std::vector< std::map< BoundaryInfo::NodeBCTuple, Real > > &bc_vals)
Write nodeset data for the requested timestep.
virtual void initialize_element_variables(std::vector< std::string > names, const std::vector< std::set< subdomain_id_type > > &vars_active_subdomains)
Sets up the nodal variables.
void close() noexcept
Closes the ExodusII mesh file.
void read_qa_records()
Reads the QA records from an ExodusII file.
ExodusII_IO_Helper(ExodusII_IO_Helper &&)=default
void write_element_values_element_major(const MeshBase &mesh, const std::vector< Real > &values, int timestep, const std::vector< std::set< subdomain_id_type > > &vars_active_subdomains, const std::vector< std::string > &derived_var_names, const std::map< subdomain_id_type, std::vector< std::string > > &subdomain_to_var_names)
Same as the function above, but assume the input 'values' vector is in element-major order,...
void read_all_nodesets()
New API that reads all nodesets simultaneously.
std::vector< Real > elem_var_values
std::vector< int > num_nodes_per_set
std::vector< std::string > sideset_var_names
void read_bex_cv_blocks()
Reads the optional bex_cv_blocks from the ExodusII mesh file.
void get_sideset_data_indices(const MeshBase &mesh, std::map< BoundaryInfo::BCTuple, unsigned int > &bc_array_indices)
Similar to read_sideset_data(), but instead of creating one std::map per sideset per variable,...
void set_dof_object_unique_id(MeshBase &mesh, DofObject *dof_object, int exodus_mapped_id)
dof_id_type get_libmesh_elem_id(int exodus_elem_id)
void message(std::string_view msg)
Prints the message defined in msg.
ExodusII_IO_Helper & operator=(const ExodusII_IO_Helper &)=delete
This class contains references so it can't be default copy/move-assigned.
virtual void write_nodesets(const MeshBase &mesh)
Writes the nodesets contained in "mesh".
std::string get_block_name(int index)
Get the block name for the given block index if supplied in the mesh file.
void write_nodal_values(int var_id, const std::vector< Real > &values, int timestep)
Writes the vector of values to a nodal variable.
void read_elemset_info()
Reads information about all of the elemsets in the ExodusII mesh file.
std::vector< std::vector< std::vector< Real > > > bex_dense_constraint_vecs
void read_nodes()
Reads the nodal data (x,y,z coordinates) from the ExodusII mesh file.
std::vector< int > node_sets_dist_index
virtual void read_var_names_impl(const char *var_type, int &count, std::vector< std::string > &result)
read_var_names() dispatches to this function.
std::vector< int > num_elems_per_set
const char * get_elem_type() const
std::vector< int > elem_face_counts
int get_side_set_id(int index)
Get the side set id for the given side set index.
void set_max_name_length(unsigned int max_length)
Set how many characters to use in names when opening a file for writing.
void read_var_names(ExodusVarType type)
void read_sideset(int id, int offset)
Reads information about sideset id and inserts it into the global sideset array at the position offse...
int get_block_id(int index)
Get the block number for the given block index.
void write_var_names(ExodusVarType type, const std::vector< std::string > &names)
Wraps calls to exII::ex_put_var_names() and exII::ex_put_var_param().
dof_id_type added_node_offset_on(processor_id_type p) const
void read_elemset(int id, int offset)
Reads information about elemset id and inserts it into the global elemset array at the position offse...
dof_id_type get_libmesh_node_id(int exodus_node_id)
Helper function that takes a (1-based) Exodus node/elem id and determines the corresponding libMesh N...
std::vector< std::vector< int > > c0polyhedron_face_connect
void write_timestep(int timestep, Real time)
Writes the time for the timestep.
std::vector< int > exodus_elem_num_to_libmesh
std::string get_node_set_name(int index)
Get the node set name for the given node set index if supplied in the mesh file.
std::vector< std::string > global_var_names
void print_nodes(std::ostream &out_stream=libMesh::out)
Prints the nodal information, by default to libMesh::out.
std::vector< int > elem_node_counts
std::map< int, std::string > id_to_edge_block_names
void read_sideset_info()
Reads information about all of the sidesets in the ExodusII mesh file.
void conditionally_set_elem_unique_id(MeshBase &mesh, Elem *elem, int zero_based_elem_num_map_index)
virtual void create(std::string filename)
Opens an ExodusII mesh file named filename for writing.
std::map< std::string, ElemType > element_equivalence_map
Defines equivalence classes of Exodus element types that map to libmesh ElemTypes.
std::vector< int > num_sides_per_set
std::vector< std::string > elem_var_names
void print_header()
Prints the ExodusII mesh file header, which includes the mesh title, the number of nodes,...
std::map< dof_id_type, dof_id_type > libmesh_elem_num_to_exodus
dof_id_type node_id_to_vec_id(dof_id_type n) const
void read_global_values(std::vector< Real > &values, int timestep)
Reads the vector of global variables.
void read_edge_blocks(MeshBase &mesh)
Read in edge blocks, storing information in the BoundaryInfo object.
void get_nodeset_data_indices(std::map< BoundaryInfo::NodeBCTuple, unsigned int > &bc_array_indices)
Similar to read_nodeset_data(), but instead of creating one std::map per nodeset per variable,...
void open(const char *filename, bool read_only)
Opens an ExodusII mesh file named filename.
virtual void write_elements(const MeshBase &mesh, bool use_discontinuous=false)
Writes the elements contained in "mesh".
std::vector< std::string > elemset_var_names
ExodusVarType
Wraps calls to exII::ex_get_var_names() and exII::ex_get_var_param().
std::map< dof_id_type, dof_id_type > libmesh_node_num_to_exodus
std::vector< dof_id_type > _true_node_offsets
If we're adding "fake" sides to visualize SIDE_DISCONTINUOUS variables, we also need to know how many...
std::map< int, std::map< ElemType, ExodusII_IO_Helper::Conversion > > conversion_map
Associates libMesh ElemTypes with node/face/edge/etc.
void initialize_global_variables(std::vector< std::string > names)
Sets up the global variables.
void read_sideset_data(const MeshBase &mesh, int timestep, std::vector< std::string > &var_names, std::vector< std::set< boundary_id_type > > &side_ids, std::vector< std::map< BoundaryInfo::BCTuple, Real > > &bc_vals)
Read sideset variables, if any, into the provided data structures.
void check_existing_vars(ExodusVarType type, std::vector< std::string > &names, std::vector< std::string > &names_from_file)
When appending: during initialization, check that variable names in the file match those you attempt ...
void set_hdf5_writing(bool write_hdf5)
Set to true (the default) to write files in an HDF5-based file format (when HDF5 is available),...
void set_coordinate_offset(Point p)
Allows you to set a vector that is added to the coordinates of all of the nodes.
void write_information_records(const std::vector< std::string > &records)
Writes the vector of information records.
std::map< int, std::string > id_to_ss_names
std::vector< int > node_sets_node_index
void read_elem_num_map()
Reads the optional node_num_map from the ExodusII mesh file.
void read_face_blocks()
Reads NSIDED face blocks used by NFACED element blocks.
void read_num_time_steps()
Reads the number of timesteps currently stored in the Exodus file and stores it in the num_time_steps...
std::vector< int > node_sets_node_list
const ExodusII_IO_Helper::Conversion & get_conversion(const ElemType type) const
void initialize_nodal_variables(std::vector< std::string > names)
Sets up the nodal variables.
void write_global_values(const std::vector< Real > &values, int timestep)
Writes the vector of global variables.
void get_elemset_data_indices(std::map< std::pair< dof_id_type, elemset_id_type >, unsigned int > &elemset_array_indices)
Similar to read_elemset_data(), but instead of creating one std::map per elemset per variable,...
std::string get_side_set_name(int index)
Get the side set name for the given side set index if supplied in the mesh file.
std::vector< std::string > nodeset_var_names
void conditionally_set_node_unique_id(MeshBase &mesh, Node *node, int zero_based_node_num_map_index)
Helper function that conditionally sets the unique_id of the passed-in Node/Elem.
std::vector< int > num_node_df_per_set
void read_nodal_var_values(std::string nodal_var_name, int time_step)
Reads the nodal values for the variable 'nodal_var_name' at the specified time into the 'nodal_var_va...
std::vector< std::vector< long unsigned int > > bex_cv_conn
virtual void initialize(std::string title, const MeshBase &mesh, bool use_discontinuous=false)
Initializes the Exodus file.
void set_add_sides(bool add_sides)
Sets whether or not to write extra "side" elements.
std::map< int, std::string > id_to_block_names
std::map< int, std::string > id_to_elemset_names
std::vector< Real > node_sets_dist_fact
void write_elemsets(const MeshBase &mesh)
Write elemsets stored on the Mesh to the exo file.
void write_element_values(const MeshBase &mesh, const std::vector< Real > &values, int timestep, const std::vector< std::set< subdomain_id_type > > &vars_active_subdomains)
Writes the vector of values to the element variables.
void read_elem_in_block(int block)
Reads all of the element connectivity for block block in the ExodusII mesh file.
std::vector< dof_id_type > _added_side_node_offsets
If we're adding "fake" sides to visualize SIDE_DISCONTINUOUS variables, _added_side_node_offsets[p] g...
This is the MeshBase class.
Definition mesh_base.h:81
A Node is like a Point, but with more information.
Definition node.h:55
An object whose state is distributed along a set of processors.
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition point.h:40
MeshBase & mesh
The libMesh namespace provides an interface to certain functionality in the library.
ElemType
Defines an enum for geometric element types.
int8_t boundary_id_type
Definition id_types.h:51
libmesh_assert(ctx)
OStreamProxy out
uint8_t dof_id_type
Definition id_types.h:67
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
uint8_t processor_id_type
Definition id_types.h:104
This class facilitates reading in vectors from Exodus file that may be of a different floating point ...
This class facilitates inline conversion of an input data vector to a different precision level,...