libMesh
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 
59 namespace libMesh
60 {
61 
62 // Forward declarations
63 class MeshBase;
64 class DofObject;
65 
75 {
76 public:
84  ExodusII_IO_Helper(const ParallelObject & parent,
85  bool v=false,
86  bool run_only_on_proc0=true,
87  bool single_precision=false);
94  ExodusII_IO_Helper (const ExodusII_IO_Helper &) = default;
96  virtual ~ExodusII_IO_Helper();
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 
232 
237  void read_elem_num_map();
238 
243  void read_sideset_info();
244 
249  void read_nodeset_info();
250 
255  void read_elemset_info();
256 
261  void read_sideset(int id, int offset);
262 
267  void read_elemset(int id, int offset);
268 
274  void read_all_nodesets();
275 
282  void close() noexcept;
283 
287  void read_time_steps();
288 
293  void read_num_time_steps();
294 
299  void read_nodal_var_values(std::string nodal_var_name, int time_step);
300 
305  void read_elemental_var_values(std::string elemental_var_name,
306  int time_step,
307  std::map<dof_id_type, Real> & elem_var_value_map);
308 
315  dof_id_type get_libmesh_node_id(int exodus_node_id);
316  dof_id_type get_libmesh_elem_id(int exodus_elem_id);
317 
327  MeshBase & mesh, Node * node, int zero_based_node_num_map_index);
329  MeshBase & mesh, Elem * elem, int zero_based_elem_num_map_index);
330 
331 private:
332 
337  int exodus_id,
338  const std::vector<int> & num_map);
339 
341  MeshBase & mesh,
342  DofObject * dof_object,
343  int exodus_mapped_id);
344 
345 public:
346 
350  virtual void create(std::string filename);
351 
355  virtual void initialize(std::string title, const MeshBase & mesh, bool use_discontinuous=false);
356 
360  virtual void write_nodal_coordinates(const MeshBase & mesh, bool use_discontinuous=false);
361 
376  virtual void write_elements(const MeshBase & mesh,
377  bool use_discontinuous=false);
378 
382  virtual void write_sidesets(const MeshBase & mesh);
383 
387  virtual void write_nodesets(const MeshBase & mesh);
388 
392  virtual void initialize_element_variables(std::vector<std::string> names,
393  const std::vector<std::set<subdomain_id_type>> & vars_active_subdomains);
394 
398  void initialize_nodal_variables(std::vector<std::string> names);
399 
403  void initialize_global_variables(std::vector<std::string> names);
404 
408  void write_timestep(int timestep, Real time);
409 
413  void write_elemsets(const MeshBase & mesh);
414 
418  void
420  int timestep,
421  const std::vector<std::string> & var_names,
422  const std::vector<std::set<boundary_id_type>> & side_ids,
423  const std::vector<std::map<BoundaryInfo::BCTuple, Real>> & bc_vals);
424 
428  void
430  int timestep,
431  std::vector<std::string> & var_names,
432  std::vector<std::set<boundary_id_type>> & side_ids,
433  std::vector<std::map<BoundaryInfo::BCTuple, Real>> & bc_vals);
434 
445  void
447  std::map<BoundaryInfo::BCTuple, unsigned int> & bc_array_indices);
448 
452  void
453  write_nodeset_data (int timestep,
454  const std::vector<std::string> & var_names,
455  const std::vector<std::set<boundary_id_type>> & node_boundary_ids,
456  const std::vector<std::map<BoundaryInfo::NodeBCTuple, Real>> & bc_vals);
457 
461  void
462  read_nodeset_data (int timestep,
463  std::vector<std::string> & var_names,
464  std::vector<std::set<boundary_id_type>> & node_boundary_ids,
465  std::vector<std::map<BoundaryInfo::NodeBCTuple, Real>> & bc_vals);
466 
474  void
475  get_nodeset_data_indices (std::map<BoundaryInfo::NodeBCTuple, unsigned int> & bc_array_indices);
476 
480  void
481  write_elemset_data (int timestep,
482  const std::vector<std::string> & var_names,
483  const std::vector<std::set<elemset_id_type>> & elemset_ids_in,
484  const std::vector<std::map<std::pair<dof_id_type, elemset_id_type>, Real>> & elemset_vals);
485 
489  void
490  read_elemset_data (int timestep,
491  std::vector<std::string> & var_names,
492  std::vector<std::set<elemset_id_type>> & elemset_ids_in,
493  std::vector<std::map<std::pair<dof_id_type, elemset_id_type>, Real>> & elemset_vals);
494 
502  void
503  get_elemset_data_indices (std::map<std::pair<dof_id_type, elemset_id_type>, unsigned int> & elemset_array_indices);
504 
517  (const MeshBase & mesh,
518  const std::vector<Real> & values,
519  int timestep,
520  const std::vector<std::set<subdomain_id_type>> & vars_active_subdomains);
521 
537  (const MeshBase & mesh,
538  const std::vector<Real> & values,
539  int timestep,
540  const std::vector<std::set<subdomain_id_type>> & vars_active_subdomains,
541  const std::vector<std::string> & derived_var_names,
542  const std::map<subdomain_id_type, std::vector<std::string>> & subdomain_to_var_names);
543 
547  void write_nodal_values(int var_id, const std::vector<Real> & values, int timestep);
548 
552  void write_information_records(const std::vector<std::string> & records);
553 
557  void write_global_values(const std::vector<Real> & values, int timestep);
558 
562  void update();
563 
567  void read_global_values(std::vector<Real> & values, int timestep);
568 
578 
585  void set_hdf5_writing(bool write_hdf5);
586 
599  void write_as_dimension(unsigned dim);
600 
606 
611  void set_max_name_length(unsigned int max_length);
612 
619  std::vector<std::string>
620  get_complex_names(const std::vector<std::string> & names,
621  bool write_complex_abs) const;
622 
627  std::vector<std::set<subdomain_id_type>>
629  (const std::vector<std::set<subdomain_id_type>> & vars_active_subdomains,
630  bool write_complex_abs) const;
631 
639  std::map<subdomain_id_type, std::vector<std::string>>
641  (const std::map<subdomain_id_type, std::vector<std::string>> & subdomain_to_var_names,
642  bool write_complex_abs) const;
643 
649  class Conversion;
650 
656  class NamesData;
657 
662  void message(std::string_view msg);
663 
669  void message(std::string_view msg, int i);
670 
671  // File identification flag
672  int ex_id;
673 
674  // General error flag
675  int ex_err;
676 
677  // struct which contains data fields from the Exodus file header
679 
680  // Problem title (Use vector<char> to emulate a char *)
681  std::vector<char> & title;
682 
683  // Number of dimensions in the mesh
684  int & num_dim;
685 
686  // Total number of nodes in the mesh
687  int & num_nodes;
688 
689  // Total number of elements in the mesh
690  int & num_elem;
691 
692  // Smallest element id which exceeds every element id in the mesh.
693  // (this may exceed num_elem due to mapping)
694  int end_elem_id() const;
695 
696  // Total number of element blocks
698 
699  // Total number of edges
700  int & num_edge;
701 
702  // Total number of edge blocks. The sum of the number of edges in
703  // each block must equal num_edge.
705 
706  // Total number of node sets
708 
709  // Total number of side sets
711 
712  // Total number of element sets
714 
715  // Number of global variables
717 
718  // Number of sideset variables
720 
721  // Number of nodeset variables
723 
724  // Number of elemset variables
726 
727  // Number of elements in this block
729 
730  // Number of nodes in each element
732 
733  // Number of attributes for a given block
734  int num_attr;
735 
736  // Total number of elements in all side sets
738 
739  // Total number of elements in all elem sets
741 
742  // Vector of element block identification numbers
743  std::vector<int> block_ids;
744 
745  // Vector of edge block identification numbers
746  std::vector<int> edge_block_ids;
747 
748  // Vector of nodes in an element
749  std::vector<int> connect;
750 
751  // Vector of the sideset IDs
752  std::vector<int> ss_ids;
753 
754  // Vector of the nodeset IDs
755  std::vector<int> nodeset_ids;
756 
757  // Vector of the elemset IDs
758  std::vector<int> elemset_ids;
759 
760  // Number of sides in each sideset
761  std::vector<int> num_sides_per_set;
762 
763  // Number of nodes in each nodeset
764  std::vector<int> num_nodes_per_set;
765 
766  // Number of elems in each elemset
767  std::vector<int> num_elems_per_set;
768 
769  // Number of distribution factors per sideset
770  std::vector<int> num_df_per_set;
771 
772  // Number of distribution factors per nodeset
773  std::vector<int> num_node_df_per_set;
774 
775  // Number of distribution factors per elemset
776  std::vector<int> num_elem_df_per_set;
777 
778  // Starting indices for each nodeset in the node_sets_node_list vector.
779  // Used in the calls to ex_{put,get}_concat_node_sets().
780  std::vector<int> node_sets_node_index;
781 
782  // Starting indices for each nodeset in the node_sets_dist_fact vector.
783  // Used in the calls to ex_{put,get}_concat_node_sets().
784  std::vector<int> node_sets_dist_index;
785 
786  // Node ids for all nodes in nodesets, concatenated together.
787  // Used in the calls to ex_{put,get}_concat_node_sets().
788  std::vector<int> node_sets_node_list;
789 
790  // Distribution factors for all nodes in all nodesets, concatenated together.
791  // Used in the calls to ex_{put,get}_concat_node_sets().
792  std::vector<Real> node_sets_dist_fact;
793 
794  // List of element numbers in all sidesets
795  std::vector<int> elem_list;
796 
797  // Side (face/edge) number actually on the boundary
798  std::vector<int> side_list;
799 
800  // Side (face/edge) id number
801  std::vector<int> id_list;
802 
803  // List of element numbers in all elemsets
804  std::vector<int> elemset_list;
805 
806  // List of elemset ids for all elements in elemsets
807  std::vector<int> elemset_id_list;
808 
809  // Optional mapping from internal [0,num_nodes) to arbitrary indices
810  std::vector<int> node_num_map;
811 
812  // Optional mapping from internal [0,num_elem) to arbitrary indices
813  std::vector<int> elem_num_map;
814 
815  // x locations of node points
816  std::vector<Real> x;
817 
818  // y locations of node points
819  std::vector<Real> y;
820 
821  // z locations of node points
822  std::vector<Real> z;
823 
824  // Spline weights associated with node points, in IGA meshes
825  std::vector<Real> w;
826 
827  // Number of Bezier Extraction coefficient vectors in a block
828  unsigned int bex_num_elem_cvs;
829 
830  // Bezier Extraction connectivity indices, in IGA meshes
831  std::vector<std::vector<long unsigned int>> bex_cv_conn;
832 
833  // Bezier Extraction coefficient vectors, in IGA meshes
834  // bex_dense_constraint_vecs[block_num][vec_num][column_num] = coef
835  std::vector<std::vector<std::vector<Real>>> bex_dense_constraint_vecs;
836 
837  // Type of element in a given block
838  std::vector<char> elem_type;
839 
840  // Maps libMesh element numbers to Exodus element numbers
841  // gets filled in when write_elements gets called
842  std::map<dof_id_type, dof_id_type> libmesh_elem_num_to_exodus;
843  std::vector<int> exodus_elem_num_to_libmesh;
844 
845  // Map of all node numbers connected to local node numbers to their exodus numbering.
846  // The exodus numbers are stored in here starting with 1
847  std::map<dof_id_type, dof_id_type> libmesh_node_num_to_exodus;
848  std::vector<int> exodus_node_num_to_libmesh;
849 
850  // The number of timesteps in the file, as returned by ex_inquire
852 
853  // The timesteps stored in the solution file, filled by read_time_steps()
854  std::vector<Real> time_steps;
855 
856  // The number of nodal variables in the Exodus file
858 
859  // The names of the nodal variables stored in the Exodus file
860  std::vector<std::string> nodal_var_names;
861 
862  // Holds the nodal variable values for a given variable, one value
863  // per node, indexed by libMesh node id.
864  // This is a map so it can handle Nemesis files as well.
865  std::map<dof_id_type, Real> nodal_var_values;
866 
867  // The number of elemental variables in the Exodus file
869 
870  // The names of the elemental variables stored in the Exodus file
871  std::vector<std::string> elem_var_names;
872 
873  // Holds the elemental variable values for a given variable, one value per element
874  std::vector<Real> elem_var_values;
875 
876  // The names of the global variables stored in the Exodus file
877  std::vector<std::string> global_var_names;
878 
879  // The names of the sideset variables stored in the Exodus file
880  std::vector<std::string> sideset_var_names;
881 
882  // The names of the nodeset variables stored in the Exodus file
883  std::vector<std::string> nodeset_var_names;
884 
885  // The names of the elemset variables stored in the Exodus file
886  std::vector<std::string> elemset_var_names;
887 
888  // Maps of Ids to named entities
889  std::map<int, std::string> id_to_block_names;
890  std::map<int, std::string> id_to_edge_block_names;
891  std::map<int, std::string> id_to_ss_names;
892  std::map<int, std::string> id_to_ns_names;
893  std::map<int, std::string> id_to_elemset_names;
894 
895  // On/Off message flag
896  bool verbose;
897 
898  // Same as the ExodusII_IO flag by the same name. This flag is
899  // also set whenever ExodusII_IO::set_unique_ids_from_maps() is called.
901 
902  // This flag gets set after the Exodus file has been successfully opened for writing.
903  // Both the create() and open() (if called with EX_WRITE) functions may set this flag.
905 
906  // This flag gets set after the open() function has been successfully called.
907  // We call open() to open an ExodusII file for reading.
909 
910  // When either create() or open() is called, the Helper stores the
911  // name of the opened file as current_filename. This way, the
912  // ExodusII_IO object can check to see if, on subsequent writes, the
913  // user is asking to write to a *different* filename from the one
914  // that is currently open, and signal an error. The current
915  // ExodusII_IO implementation is designed to work with a single file
916  // only, so if you want to write to multiple Exodus files, use a
917  // different ExodusII_IO object for each one.
918  std::string current_filename;
919 
931  void read_var_names(ExodusVarType type);
932 
934  get_conversion(const ElemType type) const;
935 
937  get_conversion(std::string type_str) const;
938 
939  /*
940  * Returns the sum of node "offsets" that are to be expected from a
941  * parallel nodal solution vector that has had "fake" nodes added on
942  * each processor. This plus a node id gives a valid nodal solution
943  * vector index.
944  */
946  {
947  if (_added_side_node_offsets.empty())
948  return n;
949 
950  // Find the processor id that has node_id in the parallel vec
951  const auto lb = std::upper_bound(_true_node_offsets.begin(),
952  _true_node_offsets.end(), n);
953  libmesh_assert(lb != _true_node_offsets.end());
954  const processor_id_type p = lb - _true_node_offsets.begin();
955 
956  return n + (p ? _added_side_node_offsets[p-1] : 0);
957  }
958 
959  /*
960  * Returns the sum of both added node "offsets" on processors 0
961  * through p-1 and real nodes added on processors 0 to p.
962  * This is the starting index for added nodes' data.
963  */
965  {
966  libmesh_assert (p < _true_node_offsets.size());
967  const dof_id_type added_node_offsets =
968  (_added_side_node_offsets.empty() || !p) ? 0 :
970  return _true_node_offsets[p] + added_node_offsets;
971  }
972 
973 
974 protected:
979  void check_existing_vars(ExodusVarType type, std::vector<std::string> & names, std::vector<std::string> & names_from_file);
980 
986  void write_var_names(ExodusVarType type, const std::vector<std::string> & names);
987 
988  // If true, whenever there is an I/O operation, only perform if if we are on processor 0.
990 
991  // This flag gets set after the create() function has been successfully called.
993 
994  // True once the elem vars are initialized
996 
997  // True once the global vars are initialized
999 
1000  // True once the nodal vars are initialized
1002 
1003  // If true, use the Mesh's dimension (as determined by the dimension
1004  // of the elements comprising the mesh) instead of the mesh's
1005  // spatial dimension, when writing. By default this is false.
1007 
1008  // If true, write an HDF5 file when available. If false, write the
1009  // old format.
1011 
1012  // The maximum name length to use when writing
1013  unsigned int _max_name_length;
1014 
1015  // Set once the elem num map has been read
1017 
1018  // Use this for num_dim when writing the Exodus file. If non-zero, supersedes
1019  // any value set in _use_mesh_dimension_instead_of_spatial_dimension.
1021 
1022  // On output, shift every point by _coordinate_offset
1024 
1025  // If true, forces single precision I/O
1027 
1034  std::vector<dof_id_type> _added_side_node_offsets;
1035 
1041  std::vector<dof_id_type> _true_node_offsets;
1042 
1053  {
1054  // If necessary, allocates space to store a version of vec_in in a
1055  // different precision than it was input with.
1056  MappedOutputVector(const std::vector<Real> & vec_in,
1057  bool single_precision_in);
1058 
1059  ~MappedOutputVector() = default;
1060 
1061  // Returns void * pointer to either the mapped data or the
1062  // original data, as necessary.
1063  void * data();
1064 
1065  private:
1066  const std::vector<Real> & our_data;
1068  std::vector<double> double_vec;
1069  std::vector<float> float_vec;
1070  };
1071 
1080  {
1081  MappedInputVector(std::vector<Real> & vec_in,
1082  bool single_precision_in);
1084 
1085  // Returns void * pointer to either the mapped data or the
1086  // original data, as necessary.
1087  void * data();
1088 
1089  private:
1090  std::vector<Real> & our_data;
1092  std::vector<double> double_vec;
1093  std::vector<float> float_vec;
1094  };
1095 
1096 
1097 protected:
1098 
1103  virtual void read_var_names_impl(const char * var_type,
1104  int & count,
1105  std::vector<std::string> & result);
1106 
1107 private:
1108 
1112  bool _add_sides = false;
1113 
1117  void write_var_names_impl(const char * var_type,
1118  int & count,
1119  const std::vector<std::string> & names);
1120 
1125  std::map<std::string, ElemType> element_equivalence_map;
1127 
1136  std::map<int, std::map<ElemType, ExodusII_IO_Helper::Conversion>> conversion_map;
1137  void init_conversion_map();
1138 };
1139 
1140 
1141 
1143 {
1144 public:
1145 
1150  : node_map(nullptr),
1151  inverse_node_map(nullptr),
1152  side_map(nullptr),
1153  inverse_side_map(nullptr),
1154  shellface_map(nullptr),
1155  inverse_shellface_map(nullptr),
1158  dim(0),
1159  n_nodes(0),
1160  exodus_type("")
1161  {}
1162 
1169  int get_node_map(int i) const;
1170 
1181  int get_inverse_node_map(int i) const;
1182 
1189  int get_side_map(int i) const;
1190 
1197  int get_inverse_side_map(int i) const;
1198 
1203  int get_shellface_map(int i) const;
1204 
1208  int get_inverse_shellface_map(int i) const;
1209 
1216  ElemType libmesh_elem_type() const;
1217 
1221  std::string exodus_elem_type() const;
1222 
1226  std::size_t get_shellface_index_offset() const;
1227 
1232  static const int invalid_id;
1233 
1237  const std::vector<int> * node_map;
1238 
1244  const std::vector<int> * inverse_node_map;
1245 
1249  const std::vector<int> * side_map;
1250 
1254  const std::vector<int> * inverse_side_map;
1255 
1261  const std::vector<int> * shellface_map;
1262 
1266  const std::vector<int> * inverse_shellface_map;
1267 
1274 
1280 
1285  int dim;
1286 
1290  int n_nodes;
1291 
1295  std::string exodus_type;
1296 };
1297 
1298 
1299 
1306 {
1307 public:
1313  explicit
1314  NamesData(size_t n_strings, size_t string_length);
1315 
1319  void push_back_entry(const std::string & name);
1320 
1324  char ** get_char_star_star();
1325 
1329  char * get_char_star(int i);
1330 
1331 private:
1332  // C++ data structures for managing string memory
1333  std::vector<std::vector<char>> data_table;
1334  std::vector<char *> data_table_pointers;
1335 
1336  size_t counter;
1337  size_t table_size;
1338 };
1339 
1340 
1341 inline void ExodusII_IO_Helper::set_add_sides(bool add_sides)
1342 {
1343  _add_sides = add_sides;
1344 }
1345 
1346 
1348 {
1349  return _add_sides;
1350 }
1351 
1352 
1354 {
1355  libmesh_assert_equal_to(std::size_t(num_elem), elem_num_map.size());
1356  return _end_elem_id;
1357 }
1358 
1359 
1360 } // namespace libMesh
1361 
1362 #endif // LIBMESH_HAVE_EXODUS_API
1363 
1364 #endif // LIBMESH_EXODUSII_IO_HELPER_H
const std::vector< int > * node_map
Pointer to the node map for this element.
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
virtual void write_sidesets(const MeshBase &mesh)
Writes the sidesets contained in "mesh".
std::vector< int > num_elems_per_set
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.
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_var_names(ExodusVarType type, const std::vector< std::string > &names)
Wraps calls to exII::ex_put_var_names() and exII::ex_put_var_param().
This class facilitates inline conversion of an input data vector to a different precision level...
ElemType
Defines an enum for geometric element types.
std::vector< std::string > sideset_var_names
void read_node_num_map()
Reads the optional node_num_map from the ExodusII mesh file.
std::vector< int > num_sides_per_set
void set_max_name_length(unsigned int max_length)
Set how many characters to use in names when opening a file for writing.
const char * get_elem_type() const
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...
void read_elemset(int id, int offset)
Reads information about elemset id and inserts it into the global elemset array at the position offse...
std::vector< std::string > elem_var_names
A Node is like a Point, but with more information.
Definition: node.h:52
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.
ExodusHeaderInfo read_header() const
Reads an ExodusII mesh file header, leaving this object&#39;s internal data structures unchanged...
std::map< int, std::string > id_to_ss_names
std::vector< std::string > get_complex_names(const std::vector< std::string > &names, bool write_complex_abs) const
This class is used as both an external data structure for passing around Exodus file header informati...
std::string get_block_name(int index)
Get the block name for the given block index if supplied in the mesh file.
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 read_nodal_var_values(std::string nodal_var_name, int time_step)
Reads the nodal values for the variable &#39;nodal_var_name&#39; at the specified time into the &#39;nodal_var_va...
ExodusII_IO_Helper(const ParallelObject &parent, bool v=false, bool run_only_on_proc0=true, bool single_precision=false)
Constructor.
void write_information_records(const std::vector< std::string > &records)
Writes the vector of information records.
virtual void read_var_names_impl(const char *var_type, int &count, std::vector< std::string > &result)
read_var_names() dispatches to this function.
unsigned int dim
static const int invalid_id
An invalid_id that can be returned to signal failure in case something goes wrong.
void write_as_dimension(unsigned dim)
Sets the value of _write_as_dimension.
std::vector< int > exodus_elem_num_to_libmesh
std::map< dof_id_type, Real > nodal_var_values
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.
This is the base class from which all geometric element types are derived.
Definition: elem.h:94
MeshBase & mesh
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...
dof_id_type node_id_to_vec_id(dof_id_type n) const
dof_id_type get_libmesh_id(int exodus_id, const std::vector< int > &num_map)
Internal implementation for the two sets of functions above.
virtual void write_nodesets(const MeshBase &mesh)
Writes the nodesets contained in "mesh".
ExodusII_IO_Helper & operator=(const ExodusII_IO_Helper &)=delete
This class contains references so it can&#39;t be default copy/move-assigned.
void read_bex_cv_blocks()
Reads the optional bex_cv_blocks from the ExodusII mesh file.
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.
MappedOutputVector(const std::vector< Real > &vec_in, bool single_precision_in)
std::vector< Real > time_steps
virtual void write_elements(const MeshBase &mesh, bool use_discontinuous=false)
Writes the elements contained in "mesh".
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...
void write_elemsets(const MeshBase &mesh)
Write elemsets stored on the Mesh to the exo file.
const ExodusII_IO_Helper::Conversion & get_conversion(const ElemType type) const
void print_nodes(std::ostream &out_stream=libMesh::out)
Prints the nodal information, by default to libMesh::out.
The libMesh namespace provides an interface to certain functionality in the library.
std::vector< std::vector< char > > data_table
void read_time_steps()
Reads and stores the timesteps in the &#39;time_steps&#39; array.
std::vector< int > node_sets_node_index
std::vector< char > & title
void write_nodal_values(int var_id, const std::vector< Real > &values, int timestep)
Writes the vector of values to a nodal variable.
bool _add_sides
Set to true iff we want to write separate "side" elements too.
void message(std::string_view msg)
Prints the message defined in msg.
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 ...
const std::vector< int > * inverse_side_map
Pointer to the inverse side map for this element.
void read_nodes()
Reads the nodal data (x,y,z coordinates) from the ExodusII mesh file.
std::string exodus_type
The string corresponding to the Exodus type for this element.
std::vector< std::string > nodeset_var_names
std::map< dof_id_type, dof_id_type > libmesh_node_num_to_exodus
int n_nodes
The number of nodes per element; useful likewise.
uint8_t processor_id_type
Definition: id_types.h:104
This is the MeshBase class.
Definition: mesh_base.h:80
void close() noexcept
Closes the ExodusII mesh 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 write_timestep(int timestep, Real time)
Writes the time for the timestep.
void read_edge_blocks(MeshBase &mesh)
Read in edge blocks, storing information in the BoundaryInfo object.
const std::vector< int > * inverse_shellface_map
Pointer to the inverse shellface map for this element.
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 set_add_sides(bool add_sides)
Sets whether or not to write extra "side" elements.
void open(const char *filename, bool read_only)
Opens an ExodusII mesh file named filename.
char * get_char_star(int i)
Provide access to the i&#39;th underlying char *.
void set_dof_object_unique_id(MeshBase &mesh, DofObject *dof_object, int exodus_mapped_id)
void update()
Uses ex_update() to flush buffers to file.
void push_back_entry(const std::string &name)
Adds another name to the current data table.
void read_all_nodesets()
New API that reads all nodesets simultaneously.
void read_global_values(std::vector< Real > &values, int timestep)
Reads the vector of global variables.
std::vector< std::string > global_var_names
int dim
The element dimension; useful since we don&#39;t seem to have a cheap way to look this up from ElemType...
MappedInputVector(std::vector< Real > &vec_in, bool single_precision_in)
void read_var_names(ExodusVarType type)
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.
void read_elemset_info()
Reads information about all of the elemsets in the ExodusII mesh file.
libmesh_assert(ctx)
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.
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 &#39;values&#39; vector is in element-major order...
This class facilitates reading in vectors from Exodus file that may be of a different floating point ...
void read_nodeset_info()
Reads information about all of the nodesets in the ExodusII mesh file.
This is the ExodusII_IO_Helper class.
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_global_values(const std::vector< Real > &values, int timestep)
Writes the vector of global variables.
std::vector< dof_id_type > _true_node_offsets
If we&#39;re adding "fake" sides to visualize SIDE_DISCONTINUOUS variables, we also need to know how many...
An object whose state is distributed along a set of processors.
void read_elem_in_block(int block)
Reads all of the element connectivity for block block in the ExodusII mesh file.
std::map< dof_id_type, dof_id_type > libmesh_elem_num_to_exodus
const std::vector< int > * shellface_map
Pointer to the shellface map for this element.
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.
std::vector< Real > elem_var_values
std::vector< int > num_node_df_per_set
char ** get_char_star_star()
Provide access to the underlying C data table.
int get_node_set_id(int index)
Get the node set id for the given node set index.
ExodusVarType
Wraps calls to exII::ex_get_var_names() and exII::ex_get_var_param().
std::map< std::string, ElemType > element_equivalence_map
Defines equivalence classes of Exodus element types that map to libmesh ElemTypes.
virtual void initialize(std::string title, const MeshBase &mesh, bool use_discontinuous=false)
Initializes the Exodus file.
virtual void create(std::string filename)
Opens an ExodusII mesh file named filename for writing.
std::vector< int > node_sets_node_list
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void read_num_time_steps()
Reads the number of timesteps currently stored in the Exodus file and stores it in the num_time_steps...
void read_block_info()
Reads information for all of the blocks in the ExodusII mesh file.
const std::vector< int > * side_map
Pointer to the side map for this element.
void read_elem_num_map()
Reads the optional node_num_map from the ExodusII mesh file.
void read_and_store_header_info()
Reads an ExodusII mesh file header, and stores required information on this object.
void read_sideset(int id, int offset)
Reads information about sideset id and inserts it into the global sideset array at the position offse...
std::vector< dof_id_type > _added_side_node_offsets
If we&#39;re adding "fake" sides to visualize SIDE_DISCONTINUOUS variables, _added_side_node_offsets[p] g...
OStreamProxy out
NamesData(size_t n_strings, size_t string_length)
Constructor.
size_t shellface_index_offset
The shellface index offset defines the offset due to a difference between libMesh and Exodus in index...
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)...
std::map< int, std::string > id_to_block_names
void conditionally_set_elem_unique_id(MeshBase &mesh, Elem *elem, int zero_based_elem_num_map_index)
The DofObject defines an abstract base class for objects that have degrees of freedom associated with...
Definition: dof_object.h:54
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...
int get_side_set_id(int index)
Get the side set id for the given side set index.
std::vector< std::string > elemset_var_names
void print_header()
Prints the ExodusII mesh file header, which includes the mesh title, the number of nodes...
std::vector< int > exodus_node_num_to_libmesh
std::map< int, std::string > id_to_ns_names
void initialize_nodal_variables(std::vector< std::string > names)
Sets up the nodal variables.
std::vector< int > num_nodes_per_set
std::vector< std::string > nodal_var_names
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::map< int, std::string > id_to_elemset_names
const std::vector< int > * inverse_node_map
Pointer to the inverse node map for this element.
ElemType libmesh_type
The canonical (i.e.
std::vector< int > edge_block_ids
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. ...
void read_qa_records()
Reads the QA records from an ExodusII file.
This class is useful for managing anything that requires a char ** input/output in ExodusII file...
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 &#39;elemental_var_name&#39; at the specified timestep into the &#39;elem...
std::vector< Real > node_sets_dist_fact
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition: point.h:39
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...
int get_block_id(int index)
Get the block number for the given block index.
dof_id_type get_libmesh_elem_id(int exodus_elem_id)
std::vector< int > num_df_per_set
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...
std::map< int, std::map< ElemType, ExodusII_IO_Helper::Conversion > > conversion_map
Associates libMesh ElemTypes with node/face/edge/etc.
std::vector< int > node_sets_dist_index
std::vector< int > elemset_id_list
virtual void write_nodal_coordinates(const MeshBase &mesh, bool use_discontinuous=false)
Writes the nodal coordinates contained in "mesh".
std::vector< int > num_elem_df_per_set
dof_id_type added_node_offset_on(processor_id_type p) const
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::vector< std::vector< long unsigned int > > bex_cv_conn
uint8_t dof_id_type
Definition: id_types.h:67
std::vector< std::vector< std::vector< Real > > > bex_dense_constraint_vecs