libMesh
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Protected Member Functions | Protected Attributes | Private Types | Private Member Functions | Private Attributes | List of all members
libMesh::Nemesis_IO_Helper Class Reference

This is the Nemesis_IO_Helper class. More...

#include <nemesis_io_helper.h>

Inheritance diagram for libMesh::Nemesis_IO_Helper:
[legend]

Public Types

enum  ExodusVarType {
  NODAL =0, ELEMENTAL =1, GLOBAL =2, SIDESET =3,
  NODESET =4, ELEMSET =5
}
 Wraps calls to exII::ex_get_var_names() and exII::ex_get_var_param(). More...
 

Public Member Functions

 Nemesis_IO_Helper (const ParallelObject &parent, bool verbose=false, bool single_precision=false)
 Constructor. More...
 
virtual ~Nemesis_IO_Helper ()
 Destructor. More...
 
void write_complex_magnitude (bool val)
 Set the flag indicating whether the complex modulus should be written when complex numbers are enabled. More...
 
void read_nodeset (int id)
 Reading functions. More...
 
void get_init_global ()
 Fills: num_nodes_global, num_elems_global, num_elem_blks_global, num_node_sets_global, num_side_sets_global Call after: read_and_store_header_info() Call before: Any other get_* function from this class. More...
 
void get_ss_param_global ()
 Fills: global_sideset_ids, num_global_side_counts, num_global_side_df_counts Call after: get_init_global() More...
 
void get_ns_param_global ()
 
void get_eb_info_global ()
 
void get_init_info ()
 
void get_loadbal_param ()
 
void get_elem_map ()
 
void get_node_map ()
 
void get_cmap_params ()
 
void get_node_cmap ()
 
void get_elem_cmap ()
 
void put_init_info (unsigned num_proc, unsigned num_proc_in_file, const char *ftype)
 Writing functions. More...
 
void put_init_global (dof_id_type num_nodes_global, dof_id_type num_elems_global, unsigned num_elem_blks_global, unsigned num_node_sets_global, unsigned num_side_sets_global)
 Writes global information including: .) global number of nodes .) global number of elems .) global number of element blocks .) global number of node sets .) global number of side sets. More...
 
void put_eb_info_global (std::vector< int > &global_elem_blk_ids, std::vector< int > &global_elem_blk_cnts)
 Writes global block information to the file .) global_elem_blk_ids - list of block IDs for all blocks present in the mesh .) global_elem_blk_cnts - number of elements in each block for the global mesh. More...
 
void put_ns_param_global (std::vector< int > &global_nodeset_ids, std::vector< int > &num_global_node_counts, std::vector< int > &num_global_node_df_counts)
 This function writes information about global node sets. More...
 
void put_ss_param_global (std::vector< int > &global_sideset_ids, std::vector< int > &num_global_side_counts, std::vector< int > &num_global_side_df_counts)
 This function writes information about global side sets. More...
 
void put_loadbal_param (unsigned num_internal_nodes, unsigned num_border_nodes, unsigned num_external_nodes, unsigned num_internal_elems, unsigned num_border_elems, unsigned num_node_cmaps, unsigned num_elem_cmaps)
 Writes load balance parameters, some of which are described below: .) num_internal_nodes - nodes "wholly" owned by the current processor .) num_border_nodes - nodes local to a processor but residing in an element which also has nodes on other processors .) num_external_nodes - nodes that reside on other processors but whose element "partially" resides on the current processor – we assert this should be zero on reading! .) num_border_elems - elements local to this processor but whose nodes reside on other processors as well. More...
 
void put_cmap_params (std::vector< int > &node_cmap_ids, std::vector< int > &node_cmap_node_cnts, std::vector< int > &elem_cmap_ids, std::vector< int > &elem_cmap_elem_cnts)
 Outputs initial information for communication maps. More...
 
void put_node_cmap (std::vector< std::vector< int >> &node_cmap_node_ids, std::vector< std::vector< int >> &node_cmap_proc_ids)
 Outputs all of the nodal communication maps for this processor. More...
 
void put_node_map (std::vector< int > &node_mapi, std::vector< int > &node_mapb, std::vector< int > &node_mape)
 Outputs IDs of internal, border, and external nodes. More...
 
void put_elem_cmap (std::vector< std::vector< int >> &elem_cmap_elem_ids, std::vector< std::vector< int >> &elem_cmap_side_ids, std::vector< std::vector< int >> &elem_cmap_proc_ids)
 Writes information about elemental communication map. More...
 
void put_elem_map (std::vector< int > &elem_mapi, std::vector< int > &elem_mapb)
 Outputs IDs of internal and border elements. More...
 
virtual void write_nodal_coordinates (const MeshBase &mesh, bool use_discontinuous=false) override
 This function is specialized from ExodusII_IO_Helper to write only the nodal coordinates stored on the local piece of the Mesh. More...
 
virtual void write_elements (const MeshBase &mesh, bool use_discontinuous=false) override
 This function is specialized to write the connectivity. More...
 
virtual void write_sidesets (const MeshBase &mesh) override
 Writes the sidesets for this processor. More...
 
virtual void write_nodesets (const MeshBase &mesh) override
 Writes the nodesets for this processor. More...
 
virtual void initialize (std::string title, const MeshBase &mesh, bool use_discontinuous=false) override
 Specialization of the initialize function from ExodusII_IO_Helper that also writes global initial data to file. More...
 
void compute_num_global_elem_blocks (const MeshBase &pmesh)
 This function uses global communication routines to determine the number of element blocks across the entire mesh. More...
 
void build_element_and_node_maps (const MeshBase &pmesh)
 This function builds the libmesh -> exodus and exodus -> libmesh node and element maps. More...
 
void write_nodal_solution (const NumericVector< Number > &parallel_soln, const std::vector< std::string > &names, int timestep, const std::vector< std::string > &output_names)
 Takes a parallel solution vector containing the node-major solution vector for all variables and outputs it to the files. More...
 
void write_nodal_solution (const EquationSystems &es, const std::vector< std::pair< unsigned int, unsigned int >> &var_nums, int timestep, const std::vector< std::string > &output_names)
 Outputs EquationSystems current_local_solution nodal values. More...
 
void write_nodal_solution (const std::vector< Number > &values, const std::vector< std::string > &names, int timestep)
 Takes a solution vector containing the solution for all variables and outputs it to the files. More...
 
virtual void initialize_element_variables (std::vector< std::string > names, const std::vector< std::set< subdomain_id_type >> &vars_active_subdomains) override
 Override the Exodus Helper's implementation of this function so that it works correctly in parallel. More...
 
void write_element_values (const MeshBase &mesh, const EquationSystems &es, const std::vector< std::pair< unsigned int, unsigned int >> &var_nums, int timestep, const std::vector< std::set< subdomain_id_type >> &vars_active_subdomains)
 Writes the vector of elemental variable values, one variable and one subdomain at a time. More...
 
std::string construct_nemesis_filename (std::string_view base_filename)
 Given base_filename, foo.e, constructs the Nemesis filename foo.e.X.Y, where X=n. More...
 
const char * get_elem_type () const
 
void set_add_sides (bool add_sides)
 Sets whether or not to write extra "side" elements. More...
 
bool get_add_sides ()
 
void open (const char *filename, bool read_only)
 Opens an ExodusII mesh file named filename. More...
 
ExodusHeaderInfo read_header () const
 Reads an ExodusII mesh file header, leaving this object's internal data structures unchanged. More...
 
void read_and_store_header_info ()
 Reads an ExodusII mesh file header, and stores required information on this object. More...
 
void read_qa_records ()
 Reads the QA records from an ExodusII file. More...
 
void print_header ()
 Prints the ExodusII mesh file header, which includes the mesh title, the number of nodes, number of elements, mesh dimension, number of sidesets, and number of nodesets. More...
 
void read_nodes ()
 Reads the nodal data (x,y,z coordinates) from the ExodusII mesh file. More...
 
void read_node_num_map ()
 Reads the optional node_num_map from the ExodusII mesh file. More...
 
void read_bex_cv_blocks ()
 Reads the optional bex_cv_blocks from the ExodusII mesh file. More...
 
void print_nodes (std::ostream &out_stream=libMesh::out)
 Prints the nodal information, by default to libMesh::out. More...
 
void read_block_info ()
 Reads information for all of the blocks in the ExodusII mesh file. More...
 
int get_block_id (int index)
 Get the block number for the given block index. More...
 
std::string get_block_name (int index)
 Get the block name for the given block index if supplied in the mesh file. More...
 
int get_side_set_id (int index)
 Get the side set id for the given side set index. More...
 
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. More...
 
int get_node_set_id (int index)
 Get the node set id for the given node set index. More...
 
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. More...
 
void read_elem_in_block (int block)
 Reads all of the element connectivity for block block in the ExodusII mesh file. More...
 
void read_edge_blocks (MeshBase &mesh)
 Read in edge blocks, storing information in the BoundaryInfo object. More...
 
void read_elem_num_map ()
 Reads the optional node_num_map from the ExodusII mesh file. More...
 
void read_sideset_info ()
 Reads information about all of the sidesets in the ExodusII mesh file. More...
 
void read_nodeset_info ()
 Reads information about all of the nodesets in the ExodusII mesh file. More...
 
void read_elemset_info ()
 Reads information about all of the elemsets in the ExodusII mesh file. More...
 
void read_sideset (int id, int offset)
 Reads information about sideset id and inserts it into the global sideset array at the position offset. More...
 
void read_elemset (int id, int offset)
 Reads information about elemset id and inserts it into the global elemset array at the position offset. More...
 
void read_all_nodesets ()
 New API that reads all nodesets simultaneously. More...
 
void close () noexcept
 Closes the ExodusII mesh file. More...
 
void read_time_steps ()
 Reads and stores the timesteps in the 'time_steps' array. More...
 
void read_num_time_steps ()
 Reads the number of timesteps currently stored in the Exodus file and stores it in the num_time_steps variable. More...
 
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_values' array. More...
 
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_var_value_map' which is passed in. More...
 
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 Node/Elem id. More...
 
dof_id_type get_libmesh_elem_id (int exodus_elem_id)
 
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. More...
 
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. More...
 
void initialize_nodal_variables (std::vector< std::string > names)
 Sets up the nodal variables. More...
 
void initialize_global_variables (std::vector< std::string > names)
 Sets up the global variables. More...
 
void write_timestep (int timestep, Real time)
 Writes the time for the timestep. More...
 
void write_elemsets (const MeshBase &mesh)
 Write elemsets stored on the Mesh to the exo file. More...
 
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. More...
 
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. More...
 
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, creates a single map of (elem, side, boundary_id) tuples, and stores the exo file array indexing for any/all sideset variables on that sideset (they are all the same). More...
 
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. More...
 
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. More...
 
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, creates a single map of (node_id, boundary_id) tuples, and stores the exo file array indexing for any/all nodeset variables on that nodeset (they are all the same). More...
 
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. More...
 
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. More...
 
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, creates a single map of (elem_id, elemset_id) tuples, and stores the exo file array indexing for any/all elemset variables on that elemset (they are all the same). More...
 
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. More...
 
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, i.e. More...
 
void write_nodal_values (int var_id, const std::vector< Real > &values, int timestep)
 Writes the vector of values to a nodal variable. More...
 
void write_information_records (const std::vector< std::string > &records)
 Writes the vector of information records. More...
 
void write_global_values (const std::vector< Real > &values, int timestep)
 Writes the vector of global variables. More...
 
void update ()
 Uses ex_update() to flush buffers to file. More...
 
void read_global_values (std::vector< Real > &values, int timestep)
 Reads the vector of global variables. More...
 
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. More...
 
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), or to false to write files in the old NetCDF3-based format. More...
 
void write_as_dimension (unsigned dim)
 Sets the value of _write_as_dimension. More...
 
void set_coordinate_offset (Point p)
 Allows you to set a vector that is added to the coordinates of all of the nodes. More...
 
void set_max_name_length (unsigned int max_length)
 Set how many characters to use in names when opening a file for writing. More...
 
std::vector< std::string > get_complex_names (const std::vector< std::string > &names, bool write_complex_abs) const
 
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. More...
 
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 map where the original variable names have been replaced by their complex counterparts. More...
 
void message (std::string_view msg)
 Prints the message defined in msg. More...
 
void message (std::string_view msg, int i)
 Prints the message defined in msg, and appends the number i to the end of the message. More...
 
int end_elem_id () const
 
void read_var_names (ExodusVarType type)
 
const ExodusII_IO_Helper::Conversionget_conversion (const ElemType type) const
 
const ExodusII_IO_Helper::Conversionget_conversion (std::string type_str) const
 
dof_id_type node_id_to_vec_id (dof_id_type n) const
 
dof_id_type added_node_offset_on (processor_id_type p) const
 
const Parallel::Communicatorcomm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 

Static Public Member Functions

static int get_exodus_version ()
 

Public Attributes

int nemesis_err_flag
 Member data. More...
 
int num_nodes_global
 Global initial information. More...
 
int num_elems_global
 
int num_elem_blks_global
 
int num_node_sets_global
 
int num_side_sets_global
 
int num_proc
 The number of processors for which the NEMESIS I file was created. More...
 
int num_proc_in_file
 The number of processors for which the NEMESIS I file stores information. More...
 
char ftype
 The type of file to be written. More...
 
std::vector< intnode_list
 
std::vector< intglobal_sideset_ids
 Containers for reading global sideset (boundary conditions) information. More...
 
std::vector< intnum_global_side_counts
 
std::vector< intnum_global_side_df_counts
 
std::vector< intglobal_nodeset_ids
 Containers for reading global nodeset information. More...
 
std::vector< intnum_global_node_counts
 
std::vector< intnum_global_node_df_counts
 
std::vector< intglobal_elem_blk_ids
 Read the global element block IDs and counts. More...
 
std::vector< intglobal_elem_blk_cnts
 
std::set< intnodes_attached_to_local_elems
 libMesh numbered node ids attached to local elems. More...
 
std::map< subdomain_id_type, std::vector< dof_id_type > > subdomain_map
 Map of subdomains to element numbers. More...
 
std::map< int, std::vector< int > > block_id_to_elem_connectivity
 This is the block connectivity, i.e. More...
 
int num_internal_nodes
 To be used with the Nemesis::ne_get_loadbal_param() routine. More...
 
int num_border_nodes
 The number of FEM nodes local to a processor but residing in an element which also has FEM nodes on other processors. More...
 
int num_external_nodes
 The number of FEM nodes that reside on another processor but whose element partially resides on the current processor. More...
 
int num_internal_elems
 The number of internal FEM elements. More...
 
int num_border_elems
 The number of border FEM elements. More...
 
int num_node_cmaps
 The number of nodal communication maps for this processor. More...
 
int num_elem_cmaps
 The number of elemental communication maps for this processor. More...
 
std::vector< intelem_mapi
 Vector which stores internal element IDs. More...
 
std::vector< intelem_mapb
 Vector which stores border element IDs. More...
 
std::vector< intnode_mapi
 Vector which stores internal node IDs. More...
 
std::vector< intnode_mapb
 Vector which stores border node IDs. More...
 
std::vector< intnode_mape
 Vector which stores external node IDs. More...
 
std::vector< intnode_cmap_ids
 Vectors for storing the communication map parameters. More...
 
std::vector< intnode_cmap_node_cnts
 
std::vector< intelem_cmap_ids
 
std::vector< intelem_cmap_elem_cnts
 
std::vector< std::vector< int > > node_cmap_node_ids
 2 vectors of vectors for storing the node communication IDs for this processor. More...
 
std::vector< std::vector< int > > node_cmap_proc_ids
 
std::vector< std::vector< int > > elem_cmap_elem_ids
 3 vectors of vectors for storing element communication IDs for this processor. More...
 
std::vector< std::vector< int > > elem_cmap_side_ids
 
std::vector< std::vector< int > > elem_cmap_proc_ids
 
bool write_complex_abs
 By default, when complex numbers are enabled, for each variable we write out three values: the real part, "r_u" the imaginary part, "i_u", and the complex modulus, a_u := sqrt(r_u*r_u + i_u*i_u), which is also the value returned by std::abs(std::complex). More...
 
int ex_id
 
int ex_err
 
ExodusHeaderInfo header_info
 
std::vector< char > & title
 
intnum_dim
 
intnum_nodes
 
intnum_elem
 
intnum_elem_blk
 
intnum_edge
 
intnum_edge_blk
 
intnum_node_sets
 
intnum_side_sets
 
intnum_elem_sets
 
int num_global_vars
 
int num_sideset_vars
 
int num_nodeset_vars
 
int num_elemset_vars
 
int num_elem_this_blk
 
int num_nodes_per_elem
 
int num_attr
 
int num_elem_all_sidesets
 
int num_elem_all_elemsets
 
std::vector< intblock_ids
 
std::vector< intedge_block_ids
 
std::vector< intconnect
 
std::vector< intss_ids
 
std::vector< intnodeset_ids
 
std::vector< intelemset_ids
 
std::vector< intnum_sides_per_set
 
std::vector< intnum_nodes_per_set
 
std::vector< intnum_elems_per_set
 
std::vector< intnum_df_per_set
 
std::vector< intnum_node_df_per_set
 
std::vector< intnum_elem_df_per_set
 
std::vector< intnode_sets_node_index
 
std::vector< intnode_sets_dist_index
 
std::vector< intnode_sets_node_list
 
std::vector< Realnode_sets_dist_fact
 
std::vector< intelem_list
 
std::vector< intside_list
 
std::vector< intid_list
 
std::vector< intelemset_list
 
std::vector< intelemset_id_list
 
std::vector< intnode_num_map
 
std::vector< intelem_num_map
 
std::vector< Realx
 
std::vector< Realy
 
std::vector< Realz
 
std::vector< Realw
 
unsigned int bex_num_elem_cvs
 
std::vector< std::vector< long unsigned int > > bex_cv_conn
 
std::vector< std::vector< std::vector< Real > > > bex_dense_constraint_vecs
 
std::vector< char > elem_type
 
std::map< dof_id_type, dof_id_typelibmesh_elem_num_to_exodus
 
std::vector< intexodus_elem_num_to_libmesh
 
std::map< dof_id_type, dof_id_typelibmesh_node_num_to_exodus
 
std::vector< intexodus_node_num_to_libmesh
 
int num_time_steps
 
std::vector< Realtime_steps
 
int num_nodal_vars
 
std::vector< std::string > nodal_var_names
 
std::map< dof_id_type, Realnodal_var_values
 
int num_elem_vars
 
std::vector< std::string > elem_var_names
 
std::vector< Realelem_var_values
 
std::vector< std::string > global_var_names
 
std::vector< std::string > sideset_var_names
 
std::vector< std::string > nodeset_var_names
 
std::vector< std::string > elemset_var_names
 
std::map< int, std::string > id_to_block_names
 
std::map< int, std::string > id_to_edge_block_names
 
std::map< int, std::string > id_to_ss_names
 
std::map< int, std::string > id_to_ns_names
 
std::map< int, std::string > id_to_elemset_names
 
bool verbose
 
bool set_unique_ids_from_maps
 
bool opened_for_writing
 
bool opened_for_reading
 
std::string current_filename
 

Protected Member Functions

virtual void read_var_names_impl (const char *var_type, int &count, std::vector< std::string > &result) override
 read_var_names() dispatches to this function. More...
 
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 to initialize with. More...
 
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(). More...
 

Protected Attributes

bool _run_only_on_proc0
 
bool _opened_by_create
 
bool _elem_vars_initialized
 
bool _global_vars_initialized
 
bool _nodal_vars_initialized
 
bool _use_mesh_dimension_instead_of_spatial_dimension
 
bool _write_hdf5
 
unsigned int _max_name_length
 
int _end_elem_id
 
unsigned _write_as_dimension
 
Point _coordinate_offset
 
bool _single_precision
 
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] gives us the total solution vector offset to use on processor p+1 from the nodes on those previous ranks' sides. More...
 
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 real nodes from previous ranks are taking up space in a solution vector. More...
 
const Parallel::Communicator_communicator
 

Private Types

typedef std::map< unsigned, std::set< unsigned > >::iterator proc_nodes_touched_iterator
 Typedef for an iterator into the data structure above. More...
 
typedef std::map< unsigned, std::set< std::pair< unsigned, unsigned > > >::iterator proc_border_elem_sets_iterator
 Typedef for an iterator into the data structure above. More...
 

Private Member Functions

void compute_num_global_nodesets (const MeshBase &pmesh)
 This function uses global communication routines to determine the number of nodesets across the entire mesh. More...
 
void compute_num_global_sidesets (const MeshBase &pmesh)
 This function uses global communication routines to determine the number of sidesets across the entire mesh. More...
 
void compute_border_node_ids (const MeshBase &pmesh)
 This function constructs the set of border node IDs present on the current mesh. More...
 
void compute_internal_and_border_elems_and_internal_nodes (const MeshBase &pmesh)
 This function constructs the set of border and internal element IDs and internal node IDs present on the current mesh. More...
 
void compute_communication_map_parameters ()
 This function determines the communication map parameters which will eventually be written to file. More...
 
void compute_node_communication_maps ()
 Compute the node communication maps (really just pack vectors) in preparation for writing them to file. More...
 
void compute_node_maps ()
 Compute the node maps (really just pack vectors) which map the nodes to internal, border, and external nodes in the file. More...
 
void compute_elem_communication_maps ()
 This function computes element communication maps (really just packs vectors) in preparation for writing them to file. More...
 
void compute_element_maps ()
 This function computes element maps (really just packs vectors) which map the elements to internal and border elements. More...
 
void write_exodus_initialization_info (const MeshBase &pmesh, const std::string &title)
 This function writes exodus-specific initialization information. More...
 

Private Attributes

std::map< subdomain_id_type, unsigned > local_subdomain_counts
 This map keeps track of the number of elements in each subdomain (block) for this processor. More...
 
std::set< unsigned > border_node_ids
 The set which will eventually contain the IDs of "border nodes". More...
 
std::map< unsigned, std::set< unsigned > > proc_nodes_touched_intersections
 Another map to store sets of intersections with each other processor (other than ourself, of course). More...
 
std::map< unsigned, std::set< std::pair< unsigned, unsigned > > > proc_border_elem_sets
 Map between processor ID and (element,side) pairs bordering that processor ID. More...
 
std::set< unsigned > internal_node_ids
 A set of internal node IDs for this processor. More...
 
std::set< unsigned > internal_elem_ids
 A set of internal elem IDs for this processor. More...
 
std::set< unsigned > border_elem_ids
 A set of border elem IDs for this processor. More...
 

Detailed Description

This is the Nemesis_IO_Helper class.

Think of it as a big struct with storage for all the stuff one might want to pull from a Nemesis file. Derived from ExodusII_IO_Helper object, since Nemesis is based on the same file format.

Author
John W. Peterson
Roy Stogner
Date
2008
2020

Definition at line 52 of file nemesis_io_helper.h.

Member Typedef Documentation

◆ proc_border_elem_sets_iterator

typedef std::map<unsigned, std::set<std::pair<unsigned,unsigned> > >::iterator libMesh::Nemesis_IO_Helper::proc_border_elem_sets_iterator
private

Typedef for an iterator into the data structure above.

Definition at line 626 of file nemesis_io_helper.h.

◆ proc_nodes_touched_iterator

typedef std::map<unsigned, std::set<unsigned> >::iterator libMesh::Nemesis_IO_Helper::proc_nodes_touched_iterator
private

Typedef for an iterator into the data structure above.

Definition at line 616 of file nemesis_io_helper.h.

Member Enumeration Documentation

◆ ExodusVarType

Wraps calls to exII::ex_get_var_names() and exII::ex_get_var_param().

The enumeration controls whether nodal, elemental, global, etc. variable names are read and which class members are filled in. NODAL: num_nodal_vars nodal_var_names ELEMENTAL: num_elem_vars elem_var_names GLOBAL: num_global_vars global_var_names SIDESET: num_sideset_vars sideset_var_names NODESET: num_nodeset_vars nodeset_var_names

Enumerator
NODAL 
ELEMENTAL 
GLOBAL 
SIDESET 
NODESET 
ELEMSET 

Definition at line 930 of file exodusII_io_helper.h.

Constructor & Destructor Documentation

◆ Nemesis_IO_Helper()

libMesh::Nemesis_IO_Helper::Nemesis_IO_Helper ( const ParallelObject parent,
bool  verbose = false,
bool  single_precision = false 
)
explicit

Constructor.

Definition at line 77 of file nemesis_io_helper.C.

78  :
79  ExodusII_IO_Helper(parent, verbose_in, /*run_only_on_proc0=*/false, /*single_precision=*/single_precision),
86  num_proc(0),
88  ftype('\0'),
94  num_node_cmaps(0),
95  num_elem_cmaps(0),
96  write_complex_abs(true)
97 {
98  // Warn about using untested code!
99  libmesh_experimental();
100 }
char ftype
The type of file to be written.
ExodusII_IO_Helper(const ParallelObject &parent, bool v=false, bool run_only_on_proc0=true, bool single_precision=false)
Constructor.
int num_external_nodes
The number of FEM nodes that reside on another processor but whose element partially resides on the c...
int nemesis_err_flag
Member data.
int num_node_cmaps
The number of nodal communication maps for this processor.
bool write_complex_abs
By default, when complex numbers are enabled, for each variable we write out three values: the real p...
int num_nodes_global
Global initial information.
int num_proc
The number of processors for which the NEMESIS I file was created.
int num_internal_elems
The number of internal FEM elements.
int num_elem_cmaps
The number of elemental communication maps for this processor.
int num_proc_in_file
The number of processors for which the NEMESIS I file stores information.
int num_border_nodes
The number of FEM nodes local to a processor but residing in an element which also has FEM nodes on o...
int num_internal_nodes
To be used with the Nemesis::ne_get_loadbal_param() routine.
int num_border_elems
The number of border FEM elements.

◆ ~Nemesis_IO_Helper()

libMesh::Nemesis_IO_Helper::~Nemesis_IO_Helper ( )
virtual

Destructor.

Definition at line 103 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::close(), libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, and libMesh::ExodusII_IO_Helper::opened_for_writing.

104 {
105  // Our destructor is called from Nemesis_IO. We close the Exodus file here since we have
106  // responsibility for managing the file's lifetime. Only call ex_update() if the file was
107  // opened for writing!
108  if (this->opened_for_writing)
109  {
110  this->ex_err = exII::ex_update(this->ex_id);
111  EX_EXCEPTIONLESS_CHECK_ERR(ex_err, "Error flushing buffers to file.");
112  }
113  this->close();
114 }
void close() noexcept
Closes the ExodusII mesh file.

Member Function Documentation

◆ added_node_offset_on()

dof_id_type libMesh::ExodusII_IO_Helper::added_node_offset_on ( processor_id_type  p) const
inlineinherited

Definition at line 964 of file exodusII_io_helper.h.

References libMesh::ExodusII_IO_Helper::_added_side_node_offsets, libMesh::ExodusII_IO_Helper::_true_node_offsets, and libMesh::libmesh_assert().

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  }
libmesh_assert(ctx)
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...
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...
uint8_t dof_id_type
Definition: id_types.h:67

◆ build_element_and_node_maps()

void libMesh::Nemesis_IO_Helper::build_element_and_node_maps ( const MeshBase pmesh)

This function builds the libmesh -> exodus and exodus -> libmesh node and element maps.

These maps allow us to have a consistent numbering scheme within an Exodus file, given an existing globally consistent numbering scheme from LibMesh.

Definition at line 1649 of file nemesis_io_helper.C.

References block_id_to_elem_connectivity, libMesh::ExodusII_IO_Helper::block_ids, libMesh::Elem::build(), libMesh::MeshBase::elem_ref(), libMesh::ExodusII_IO_Helper::exodus_elem_num_to_libmesh, libMesh::ExodusII_IO_Helper::exodus_node_num_to_libmesh, libMesh::ExodusII_IO_Helper::get_conversion(), libMesh::index_range(), libMesh::libmesh_assert(), libMesh::ExodusII_IO_Helper::libmesh_elem_num_to_exodus, libMesh::ExodusII_IO_Helper::libmesh_node_num_to_exodus, local_subdomain_counts, libMesh::make_range(), n_nodes, libMesh::Elem::n_nodes(), libMesh::Elem::node_id(), nodes_attached_to_local_elems, libMesh::ExodusII_IO_Helper::num_nodes, libMesh::ExodusII_IO_Helper::num_nodes_per_elem, libMesh::out, libMesh::ParallelObject::processor_id(), subdomain_map, libMesh::Elem::type(), and libMesh::ExodusII_IO_Helper::verbose.

Referenced by initialize().

1650 {
1651  // If we don't have any local subdomains, it had better be because
1652  // we don't have any local elements
1653 #ifdef DEBUG
1654  if (local_subdomain_counts.empty())
1655  {
1656  libmesh_assert(pmesh.active_local_elements_begin() ==
1657  pmesh.active_local_elements_end());
1659  }
1660 #endif
1661 
1662  // Elements have to be numbered contiguously based on what block
1663  // number they are in. Therefore we have to do a bit of work to get
1664  // the block (ie subdomain) numbers first and store them off as
1665  // block_ids.
1666 
1667  // Make sure there is no leftover information in the subdomain_map, and reserve
1668  // enough space to store the elements we need.
1669  this->subdomain_map.clear();
1670  for (const auto & [sbd_id, cnt] : local_subdomain_counts)
1671  {
1672  if (verbose)
1673  {
1674  libMesh::out << "[" << this->processor_id() << "] "
1675  << "local_subdomain_counts [" << static_cast<unsigned>(sbd_id) << "]= "
1676  << cnt
1677  << std::endl;
1678  }
1679 
1680  this->subdomain_map[sbd_id].reserve(cnt);
1681  }
1682 
1683 
1684  // First loop over the elements to figure out which elements are in which subdomain
1685  for (const auto & elem : pmesh.active_local_element_ptr_range())
1686  {
1687  // Grab the nodes while we're here.
1688  for (auto n : elem->node_index_range())
1689  this->nodes_attached_to_local_elems.insert( elem->node_id(n) );
1690 
1691  subdomain_id_type cur_subdomain = elem->subdomain_id();
1692 
1693  this->subdomain_map[cur_subdomain].push_back(elem->id());
1694  }
1695 
1696  // Set num_nodes which is used by exodusII_io_helper
1697  this->num_nodes =
1698  cast_int<int>(this->nodes_attached_to_local_elems.size());
1699 
1700  // Now come up with a 1-based numbering for these nodes
1701  this->exodus_node_num_to_libmesh.clear(); // Make sure it's empty
1702  this->exodus_node_num_to_libmesh.reserve(this->nodes_attached_to_local_elems.size());
1703 
1704  // Also make sure there's no leftover information in the map which goes the
1705  // other direction.
1706  this->libmesh_node_num_to_exodus.clear();
1707 
1708  // Set the map for nodes
1709  for (const auto & id : nodes_attached_to_local_elems)
1710  {
1711  // I.e. given exodus_node_id,
1712  // exodus_node_num_to_libmesh[ exodus_node_id ] returns the
1713  // libmesh ID for that node, plus one.
1714  // Here we index libMesh IDs with an offset of 1 because they're
1715  // the literal numbers that get written to the exodus file, but
1716  // we index Exodus IDs with an offset of 0 because we read that
1717  // exodus data into a C++ vector. Confused yet?
1718  this->exodus_node_num_to_libmesh.push_back(id+1);
1719 
1720  // Likewise, given libmesh_node_id,
1721  // libmesh_node_num_to_exodus[ libmesh_node_id] returns the
1722  // *Exodus* ID for that node. Unlike the
1723  // exodus_node_num_to_libmesh vector above, this one is a
1724  // std::map. We're never handing a data buffer from it over to
1725  // another API so we don't need to do any weird offsets with it.
1726  this->libmesh_node_num_to_exodus[id] =
1727  this->exodus_node_num_to_libmesh.size(); // should never be zero...
1728  }
1729 
1730  // Now we're going to loop over the subdomain map and build a few things right
1731  // now that we'll use later.
1732 
1733  // First make sure our data structures don't have any leftover data...
1734  this->exodus_elem_num_to_libmesh.clear();
1735  this->block_ids.clear();
1736  this->libmesh_elem_num_to_exodus.clear();
1737 
1738  // Now loop over each subdomain and get a unique numbering for the elements
1739  for (auto & [block_id, elem_ids_this_subdomain] : subdomain_map)
1740  {
1741  block_ids.push_back(block_id);
1742 
1743  // The code below assumes this subdomain block is not empty, make sure that's the case!
1744  libmesh_error_msg_if(elem_ids_this_subdomain.size() == 0,
1745  "Error, no element IDs found in subdomain " << block_id);
1746 
1747  // Use the first element in this block to get representative information.
1748  // Note that Exodus assumes all elements in a block are of the same type!
1749  // We are using that same assumption here!
1750  const auto & conv = get_conversion
1751  (pmesh.elem_ref(elem_ids_this_subdomain[0]).type());
1752  this->num_nodes_per_elem =
1753  pmesh.elem_ref(elem_ids_this_subdomain[0]).n_nodes();
1754 
1755  // Get a reference to the connectivity vector for this subdomain. This vector
1756  // is most likely empty, we are going to fill it up now.
1757  std::vector<int> & current_block_connectivity = this->block_id_to_elem_connectivity[block_id];
1758 
1759  // Just in case it's not already empty...
1760  current_block_connectivity.clear();
1761  current_block_connectivity.resize(elem_ids_this_subdomain.size() * this->num_nodes_per_elem);
1762 
1763  for (auto i : index_range(elem_ids_this_subdomain))
1764  {
1765  auto elem_id = elem_ids_this_subdomain[i];
1766 
1767  // Set the number map for elements
1768  // exodus_elem_num_to_libmesh[ exodus_node_id ] returns the
1769  // libmesh ID for that element, plus one.
1770  // Like with nodes above, we index libMesh IDs with an
1771  // offset of 1 because they're the literal numbers that get
1772  // written to the exodus file, but we index Exodus IDs with
1773  // an offset of 0 because we read that exodus data into a
1774  // C++ vector.
1775  this->exodus_elem_num_to_libmesh.push_back(elem_id+1);
1776 
1777  // Likewise, given libmesh elem_id,
1778  // libmesh_elem_num_to_exodus[ elem_id ] returns the
1779  // *Exodus* ID for that node. Unlike the
1780  // exodus_elem_num_to_libmesh vector above, this one is a
1781  // std::map. We're never handing a data buffer from it over to
1782  // another API so we don't need to do any weird offsets with it.
1783  this->libmesh_elem_num_to_exodus[elem_id] =
1784  this->exodus_elem_num_to_libmesh.size();
1785 
1786  const Elem & elem = pmesh.elem_ref(elem_id);
1787 
1788  // Exodus/Nemesis want every block to have the same element type
1789  // libmesh_assert_equal_to (elem->type(), conv.libmesh_elem_type());
1790 
1791  // But we can get away with writing e.g. HEX8 and INFHEX8 in
1792  // the same block...
1793  libmesh_assert_equal_to (elem.n_nodes(), Elem::build(conv.libmesh_elem_type(), nullptr)->n_nodes());
1794 
1795  for (auto j : make_range(this->num_nodes_per_elem))
1796  {
1797  const unsigned int connect_index = (i*this->num_nodes_per_elem)+j;
1798  const unsigned int elem_node_index = conv.get_inverse_node_map(j); // inverse node map is used for writing
1799 
1800  current_block_connectivity[connect_index] =
1801  libmesh_map_find(libmesh_node_num_to_exodus,
1802  elem.node_id(elem_node_index));
1803  }
1804  } // End loop over elems in this subdomain
1805  } // end loop over subdomain_map
1806 }
std::map< subdomain_id_type, std::vector< dof_id_type > > subdomain_map
Map of subdomains to element numbers.
TestClass subdomain_id_type
Based on the 4-byte comment warning above, this probably doesn&#39;t work with exodusII at all...
Definition: id_types.h:43
std::vector< int > exodus_elem_num_to_libmesh
const ExodusII_IO_Helper::Conversion & get_conversion(const ElemType type) const
std::map< dof_id_type, dof_id_type > libmesh_node_num_to_exodus
const dof_id_type n_nodes
Definition: tecplot_io.C:67
static std::unique_ptr< Elem > build(const ElemType type, Elem *p=nullptr)
Definition: elem.C:442
libmesh_assert(ctx)
std::set< int > nodes_attached_to_local_elems
libMesh numbered node ids attached to local elems.
std::map< dof_id_type, dof_id_type > libmesh_elem_num_to_exodus
std::map< subdomain_id_type, unsigned > local_subdomain_counts
This map keeps track of the number of elements in each subdomain (block) for this processor...
std::map< int, std::vector< int > > block_id_to_elem_connectivity
This is the block connectivity, i.e.
OStreamProxy out
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176
std::vector< int > exodus_node_num_to_libmesh
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153

◆ check_existing_vars()

void libMesh::ExodusII_IO_Helper::check_existing_vars ( ExodusVarType  type,
std::vector< std::string > &  names,
std::vector< std::string > &  names_from_file 
)
protectedinherited

When appending: during initialization, check that variable names in the file match those you attempt to initialize with.

Definition at line 3522 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_max_name_length, b, libMesh::err, libMesh::Quality::name(), and libMesh::ExodusII_IO_Helper::read_var_names().

Referenced by initialize_element_variables(), libMesh::ExodusII_IO_Helper::initialize_element_variables(), libMesh::ExodusII_IO_Helper::initialize_global_variables(), and libMesh::ExodusII_IO_Helper::initialize_nodal_variables().

3525 {
3526  // There may already be global variables in the file (for example,
3527  // if we're appending) and in that case, we
3528  // 1.) Cannot initialize them again.
3529  // 2.) Should check to be sure that the global variable names are the same.
3530 
3531  // Fills up names_from_file for us
3532  this->read_var_names(type);
3533 
3534  // Both the number of variables and their names (up to the first
3535  // MAX_STR_LENGTH characters) must match for the names we are
3536  // planning to write and the names already in the file.
3537  bool match =
3538  std::equal(names.begin(), names.end(),
3539  names_from_file.begin(),
3540  [this](const std::string & a,
3541  const std::string & b) -> bool
3542  {
3543  return a.compare(/*pos=*/0, /*len=*/_max_name_length, b) == 0;
3544  });
3545 
3546  if (!match)
3547  {
3548  libMesh::err << "Error! The Exodus file already contains the variables:" << std::endl;
3549  for (const auto & name : names_from_file)
3550  libMesh::err << name << std::endl;
3551 
3552  libMesh::err << "And you asked to write:" << std::endl;
3553  for (const auto & name : names)
3554  libMesh::err << name << std::endl;
3555 
3556  libmesh_error_msg("Cannot overwrite existing variables in Exodus II file.");
3557  }
3558 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
OStreamProxy err
void read_var_names(ExodusVarType type)
static const Real b

◆ close()

void libMesh::ExodusII_IO_Helper::close ( )
noexceptinherited

Closes the ExodusII mesh file.

This function is called from the ExodusII_IO destructor, so it should not throw an exception.

Definition at line 1807 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_opened_by_create, libMesh::ExodusII_IO_Helper::_run_only_on_proc0, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::message(), libMesh::ExodusII_IO_Helper::opened_for_reading, libMesh::ExodusII_IO_Helper::opened_for_writing, and libMesh::ParallelObject::processor_id().

Referenced by ~Nemesis_IO_Helper().

1808 {
1809  // Call ex_close on every processor that did ex_open or ex_create;
1810  // newer Exodus versions error if we try to reopen a file that
1811  // hasn't been officially closed. Don't close the file if we didn't
1812  // open it; this also raises an Exodus error.
1813 
1814  // We currently do read-only ex_open on every proc (to do read
1815  // operations on every proc), but we do ex_open and ex_create for
1816  // writes on every proc only with Nemesis files.
1818  (this->processor_id() == 0) ||
1819  (!_run_only_on_proc0))
1820  {
1822  {
1823  ex_err = exII::ex_close(ex_id);
1824  // close() is called from the destructor, so it may be called e.g.
1825  // during stack unwinding while processing an exception. In that case
1826  // we don't want to throw another exception or immediately terminate
1827  // the code, since that would prevent any possible recovery from the
1828  // exception in question. So we just log the error closing the file
1829  // and continue.
1830  if (ex_err < 0)
1831  message("Error closing Exodus file.");
1832  else
1833  message("Exodus file closed successfully.");
1834  }
1835  }
1836 
1837  // Now that the file is closed, it's no longer opened for
1838  // reading or writing.
1839  opened_for_writing = false;
1840  opened_for_reading = false;
1841  _opened_by_create = false;
1842 }
void message(std::string_view msg)
Prints the message defined in msg.
processor_id_type processor_id() const

◆ comm()

const Parallel::Communicator& libMesh::ParallelObject::comm ( ) const
inlineinherited
Returns
A reference to the Parallel::Communicator object used by this mesh.

Definition at line 97 of file parallel_object.h.

References libMesh::ParallelObject::_communicator.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), libMesh::__libmesh_petsc_diff_solver_monitor(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::__libmesh_tao_equality_constraints(), libMesh::__libmesh_tao_equality_constraints_jacobian(), libMesh::__libmesh_tao_gradient(), libMesh::__libmesh_tao_hessian(), libMesh::__libmesh_tao_inequality_constraints(), libMesh::__libmesh_tao_inequality_constraints_jacobian(), libMesh::__libmesh_tao_objective(), libMesh::MeshRefinement::_coarsen_elements(), libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscLinearSolver< Number >::_petsc_shell_matrix_get_diagonal(), libMesh::SlepcEigenSolver< libMesh::Number >::_petsc_shell_matrix_get_diagonal(), libMesh::PetscLinearSolver< Number >::_petsc_shell_matrix_mult(), libMesh::SlepcEigenSolver< libMesh::Number >::_petsc_shell_matrix_mult(), libMesh::PetscLinearSolver< Number >::_petsc_shell_matrix_mult_add(), libMesh::MeshRefinement::_refine_elements(), libMesh::MeshRefinement::_smooth_flags(), libMesh::DofMap::add_constraints_to_send_list(), add_cube_convex_hull_to_mesh(), libMesh::PetscDMWrapper::add_dofs_helper(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::TransientRBConstruction::add_IC_to_RB_space(), libMesh::RBEIMEvaluation::add_interpolation_data(), libMesh::CondensedEigenSystem::add_matrices(), libMesh::EigenSystem::add_matrices(), libMesh::System::add_matrix(), libMesh::RBConstruction::add_scaled_matrix_and_vector(), libMesh::DofMap::add_variable(), libMesh::DofMap::add_variables(), libMesh::System::add_vector(), libMesh::MeshTools::Modification::all_tri(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::TransientRBConstruction::allocate_data_structures(), libMesh::RBConstruction::allocate_data_structures(), libMesh::TransientRBConstruction::assemble_affine_expansion(), libMesh::AdvectionSystem::assemble_claw_rhs(), libMesh::FEMSystem::assemble_qoi(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::MeshCommunication::assign_global_indices(), libMesh::Partitioner::assign_partitioning(), libMesh::MeshTools::Generation::build_extrusion(), libMesh::Partitioner::build_graph(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::PetscDMWrapper::build_section(), libMesh::PetscDMWrapper::build_sf(), libMesh::MeshBase::cache_elem_data(), libMesh::System::calculate_norm(), libMesh::DofMap::check_dirichlet_bcid_consistency(), libMesh::MeshTetInterface::check_hull_integrity(), libMesh::MeshBase::complete_preparation(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_max_error_bound(), compute_num_global_elem_blocks(), compute_num_global_nodesets(), compute_num_global_sidesets(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::RBSCMConstruction::compute_SCM_bounds_on_training_set(), libMesh::DofMap::computed_sparsity_already(), libMesh::Problem_Interface::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), libMesh::ContinuationSystem::ContinuationSystem(), libMesh::MeshBase::copy_constraint_rows(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::CondensedEigenSystem::copy_super_to_sub(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::MeshTools::create_bounding_box(), libMesh::DofMap::create_dof_constraints(), libMesh::MeshTools::create_nodal_bounding_box(), libMesh::MeshRefinement::create_parent_error_vector(), libMesh::MeshTools::create_processor_bounding_box(), libMesh::MeshTools::create_subdomain_bounding_box(), libMesh::PetscMatrix< T >::create_submatrix_nosort(), create_wrapped_function(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::RBEIMEvaluation::distribute_bfs(), DMlibMeshFunction(), DMlibMeshJacobian(), DMlibMeshSetSystem_libMesh(), DMVariableBounds_libMesh(), libMesh::DTKSolutionTransfer::DTKSolutionTransfer(), libMesh::MeshRefinement::eliminate_unrefined_patches(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_interiors(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_nodes(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_sides(), libMesh::TransientRBConstruction::enrich_RB_space(), libMesh::EpetraVector< T >::EpetraVector(), AssembleOptimization::equality_constraints(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::SmoothnessEstimator::estimate_smoothness(), libMesh::MeshRefinement::flag_elements_by_elem_fraction(), libMesh::MeshRefinement::flag_elements_by_error_fraction(), libMesh::MeshRefinement::flag_elements_by_error_tolerance(), libMesh::MeshRefinement::flag_elements_by_mean_stddev(), libMesh::MeshRefinement::flag_elements_by_nelem_target(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::DofMap::gather_constraints(), libMesh::MeshfreeInterpolation::gather_remote_data(), libMesh::CondensedEigenSystem::get_eigenpair(), libMesh::RBEIMEvaluation::get_eim_basis_function_node_value(), libMesh::RBEIMEvaluation::get_eim_basis_function_side_value(), libMesh::RBEIMEvaluation::get_eim_basis_function_value(), libMesh::System::get_info(), libMesh::MeshBase::get_info(), libMesh::DofMap::get_info(), libMesh::RBEIMEvaluation::get_interior_basis_functions_as_vecs(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::RBEIMConstruction::get_max_abs_value(), libMesh::RBEIMConstruction::get_node_max_abs_value(), libMesh::RBEIMEvaluation::get_parametrized_function_node_value(), libMesh::RBEIMEvaluation::get_parametrized_function_side_value(), libMesh::RBEIMEvaluation::get_parametrized_function_value(), libMesh::RBEIMConstruction::get_random_point(), libMesh::MeshTetInterface::improve_hull_integrity(), AssembleOptimization::inequality_constraints(), AssembleOptimization::inequality_constraints_jacobian(), libMesh::LocationMap< T >::init(), libMesh::TimeSolver::init(), libMesh::StaticCondensation::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::AdvectionSystem::init_data(), libMesh::ClawSystem::init_data(), libMesh::PetscDMWrapper::init_petscdm(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), libMesh::RBEIMConstruction::initialize_parametrized_functions_in_training_set(), libMesh::RBEIMConstruction::inner_product(), integrate_function(), libMesh::MeshTools::libmesh_assert_consistent_distributed(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_equal_connectivity(), libMesh::MeshTools::libmesh_assert_equal_points(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_boundary_ids(), libMesh::MeshTools::libmesh_assert_valid_constraint_rows(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_flags(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_object_ids(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_p_levels(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::MeshTools::libmesh_assert_valid_unique_ids(), libMesh::libmesh_petsc_linesearch_shellfunc(), libMesh::libmesh_petsc_preconditioner_apply(), libMesh::libmesh_petsc_recalculate_monitor(), libMesh::libmesh_petsc_snes_fd_residual(), libMesh::libmesh_petsc_snes_jacobian(), libMesh::libmesh_petsc_snes_mffd_interface(), libMesh::libmesh_petsc_snes_mffd_residual(), libMesh::libmesh_petsc_snes_postcheck(), libMesh::libmesh_petsc_snes_precheck(), libMesh::libmesh_petsc_snes_residual(), libMesh::libmesh_petsc_snes_residual_helper(), libMesh::MeshRefinement::limit_level_mismatch_at_edge(), libMesh::MeshRefinement::limit_level_mismatch_at_node(), libMesh::MeshRefinement::limit_overrefined_boundary(), libMesh::MeshRefinement::limit_underrefined_boundary(), libMesh::LinearImplicitSystem::LinearImplicitSystem(), main(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::MeshCommunication::make_elems_parallel_consistent(), libMesh::MeshRefinement::make_flags_parallel_consistent(), libMesh::MeshCommunication::make_new_node_proc_ids_parallel_consistent(), libMesh::MeshCommunication::make_new_nodes_parallel_consistent(), libMesh::MeshCommunication::make_node_bcids_parallel_consistent(), libMesh::MeshCommunication::make_node_ids_parallel_consistent(), libMesh::MeshCommunication::make_node_proc_ids_parallel_consistent(), libMesh::MeshCommunication::make_node_unique_ids_parallel_consistent(), libMesh::MeshCommunication::make_nodes_parallel_consistent(), libMesh::MeshCommunication::make_p_levels_parallel_consistent(), libMesh::MeshRefinement::make_refinement_compatible(), libMesh::TransientRBConstruction::mass_matrix_scaled_matvec(), libMesh::FEMSystem::mesh_position_set(), libMesh::TriangulatorInterface::MeshedHole::MeshedHole(), LinearElasticityWithContact::move_mesh(), libMesh::DistributedMesh::n_active_elem(), libMesh::MeshTools::n_active_levels(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::MeshTools::n_connected_components(), libMesh::DofMap::n_constrained_dofs(), libMesh::MeshBase::n_constraint_rows(), libMesh::DofMap::n_dofs(), libMesh::DofMap::n_dofs_per_processor(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::CondensedEigenSystem::n_global_non_condensed_dofs(), libMesh::MeshTools::n_levels(), MixedOrderTest::n_neighbor_links(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::SparsityPattern::Build::n_nonzeros(), libMesh::MeshTools::n_p_levels(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::RBEIMEvaluation::node_distribute_bfs(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::RBEIMConstruction::node_inner_product(), libMesh::PetscVector< libMesh::Number >::operator=(), libMesh::MeshBase::operator==(), libMesh::DistributedMesh::parallel_max_elem_id(), libMesh::DistributedMesh::parallel_max_node_id(), libMesh::ReplicatedMesh::parallel_max_unique_id(), libMesh::DistributedMesh::parallel_max_unique_id(), libMesh::DistributedMesh::parallel_n_elem(), libMesh::DistributedMesh::parallel_n_nodes(), libMesh::SparsityPattern::Build::parallel_sync(), libMesh::BoundaryInfo::parallel_sync_node_ids(), libMesh::BoundaryInfo::parallel_sync_side_ids(), libMesh::MeshTools::paranoid_n_levels(), libMesh::Partitioner::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::petsc_auto_fieldsplit(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::DofMap::process_mesh_constraint_rows(), libMesh::Partitioner::processor_pairs_to_interface_nodes(), libMesh::InterMeshProjection::project_system_vectors(), FEMParameters::read(), libMesh::Nemesis_IO::read(), libMesh::XdrIO::read(), libMesh::EquationSystems::read(), libMesh::ExodusII_IO::read_header(), libMesh::CheckpointIO::read_header(), libMesh::XdrIO::read_header(), libMesh::System::read_header(), libMesh::RBEIMEvaluation::read_in_interior_basis_functions(), libMesh::RBEIMEvaluation::read_in_node_basis_functions(), libMesh::RBEIMEvaluation::read_in_side_basis_functions(), libMesh::RBEvaluation::read_in_vectors_from_multiple_files(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs_helper(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), read_var_names_impl(), MeshFunctionTest::read_variable_info_from_output_data(), libMesh::MeshBase::recalculate_n_partitions(), libMesh::MeshRefinement::refine_and_coarsen_elements(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::StaticCondensationDofMap::reinit(), libMesh::BoundaryInfo::remove_edge_id(), libMesh::BoundaryInfo::remove_node_id(), libMesh::BoundaryInfo::remove_shellface_id(), libMesh::BoundaryInfo::remove_side_id(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DistributedMesh::renumber_nodes_and_elements(), LinearElasticityWithContact::residual_and_jacobian(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), scale_mesh_and_plot(), libMesh::DofMap::scatter_constraints(), libMesh::CheckpointIO::select_split_config(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::send_and_insert_dof_values(), libMesh::TransientRBConstruction::set_error_temporal_data(), libMesh::Partitioner::set_interface_node_processor_ids_BFS(), libMesh::Partitioner::set_interface_node_processor_ids_linear(), libMesh::Partitioner::set_interface_node_processor_ids_petscpartitioner(), libMesh::Partitioner::set_node_processor_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::Partitioner::set_parent_processor_ids(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::PetscDiffSolver::setup_petsc_data(), libMesh::RBEIMEvaluation::side_distribute_bfs(), libMesh::RBEIMEvaluation::side_gather_bfs(), libMesh::RBEIMConstruction::side_inner_product(), libMesh::Partitioner::single_partition(), libMesh::LaplaceMeshSmoother::smooth(), libMesh::VariationalMeshSmoother::smooth(), libMesh::ClawSystem::solve_conservation_law(), libMesh::split_mesh(), libMesh::RBEIMConstruction::store_eim_solutions_for_training_set(), libMesh::MeshBase::subdomain_ids(), libMesh::BoundaryInfo::sync(), libMesh::MeshBase::sync_subdomain_name_map(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), libMesh::MeshRefinement::test_level_one(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), libMesh::MeshRefinement::test_unflagged(), DofMapTest::testBadElemFECombo(), SystemsTest::testBlockRestrictedVarNDofs(), BoundaryInfoTest::testBoundaryOnChildrenErrors(), VolumeTest::testC0PolygonMethods(), VolumeTest::testC0PolyhedronMethods(), ConstraintOperatorTest::testCoreform(), ConnectedComponentsTest::testEdge(), MeshInputTest::testExodusIGASidesets(), MeshTriangulationTest::testFoundCenters(), PointLocatorTest::testLocator(), BoundaryInfoTest::testMesh(), PointLocatorTest::testPlanar(), MeshTriangulationTest::testPoly2TriRefinementBase(), SystemsTest::testProjectCubeWithMeshFunction(), BoundaryInfoTest::testRenumber(), BoundaryInfoTest::testSelectiveRenumber(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshTriangulationTest::testTriangulatorInterp(), MeshTriangulationTest::testTriangulatorMeshedHoles(), MeshTriangulationTest::testTriangulatorRoundHole(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::Poly2TriTriangulator::triangulate(), libMesh::TransientRBConstruction::truth_assembly(), libMesh::RBConstruction::truth_assembly(), libMesh::MeshRefinement::uniformly_coarsen(), update_current_local_solution(), libMesh::TransientRBConstruction::update_RB_initial_condition_all_N(), libMesh::TransientRBConstruction::update_RB_system_matrices(), libMesh::RBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), libMesh::RBConstruction::update_residual_terms(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::NameBasedIO::write(), libMesh::XdrIO::write(), libMesh::VTKIO::write_nodal_data(), libMesh::RBEIMEvaluation::write_out_interior_basis_functions(), libMesh::RBEIMEvaluation::write_out_node_basis_functions(), libMesh::RBEIMEvaluation::write_out_side_basis_functions(), libMesh::RBEvaluation::write_out_vectors(), libMesh::TransientRBConstruction::write_riesz_representors_to_files(), libMesh::RBConstruction::write_riesz_representors_to_files(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::RBDataSerialization::RBEvaluationSerialization::write_to_file(), libMesh::RBDataSerialization::TransientRBEvaluationSerialization::write_to_file(), libMesh::RBDataSerialization::RBEIMEvaluationSerialization::write_to_file(), and libMesh::RBDataSerialization::RBSCMEvaluationSerialization::write_to_file().

98  { return _communicator; }
const Parallel::Communicator & _communicator

◆ compute_border_node_ids()

void libMesh::Nemesis_IO_Helper::compute_border_node_ids ( const MeshBase pmesh)
private

This function constructs the set of border node IDs present on the current mesh.

These are nodes which live on the "border" between elements which live on different processors.

Definition at line 1812 of file nemesis_io_helper.C.

References border_node_ids, libMesh::ParallelObject::n_processors(), num_border_nodes, num_node_cmaps, libMesh::out, proc_nodes_touched_intersections, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

Referenced by initialize().

1813 {
1814  // The set which will eventually contain the IDs of "border nodes". These are nodes
1815  // that lie on the boundary between one or more processors.
1816  //std::set<unsigned> border_node_ids;
1817 
1818  // map from processor ID to set of nodes which elements from this processor "touch",
1819  // that is,
1820  // proc_nodes_touched[p] = (set all node IDs found in elements owned by processor p)
1821  std::map<unsigned, std::set<unsigned>> proc_nodes_touched;
1822 
1823 
1824  // We are going to create a lot of intermediate data structures here, so make sure
1825  // as many as possible all cleaned up by creating scope!
1826  {
1827  // Loop over active (not just active local) elements, make sets of node IDs for each
1828  // processor which has an element that "touches" a node.
1829  for (const auto & elem : pmesh.active_element_ptr_range())
1830  {
1831  // Get reference to the set for this processor. If it does not exist
1832  // it will be created.
1833  std::set<unsigned> & set_p = proc_nodes_touched[ elem->processor_id() ];
1834 
1835  // Insert all nodes touched by this element into the set
1836  for (auto node : elem->node_index_range())
1837  set_p.insert(elem->node_id(node));
1838  }
1839 
1840  if (verbose)
1841  {
1842  libMesh::out << "[" << this->processor_id()
1843  << "] proc_nodes_touched contains "
1844  << proc_nodes_touched.size()
1845  << " sets of nodes."
1846  << std::endl;
1847 
1848  for (const auto & [proc_id, set] : proc_nodes_touched)
1849  libMesh::out << "[" << this->processor_id()
1850  << "] proc_nodes_touched[" << proc_id << "] has "
1851  << set.size()
1852  << " entries."
1853  << std::endl;
1854  }
1855 
1856 
1857  // Loop over all the sets we just created and compute intersections with the
1858  // this processor's set. Obviously, don't intersect with ourself.
1859  this->proc_nodes_touched_intersections.clear();
1860  for (auto & [proc_id, other_set] : proc_nodes_touched)
1861  {
1862  // Don't compute intersections with ourself
1863  if (proc_id == this->processor_id())
1864  continue;
1865 
1866  std::set<unsigned int> this_intersection;
1867 
1868  // Otherwise, compute intersection with other processor and ourself
1869  std::set<unsigned> & my_set = proc_nodes_touched[this->processor_id()];
1870 
1871  std::set_intersection(my_set.begin(), my_set.end(),
1872  other_set.begin(), other_set.end(),
1873  std::inserter(this_intersection, this_intersection.end()));
1874 
1875  if (!this_intersection.empty())
1876  this->proc_nodes_touched_intersections.emplace
1877  (proc_id, std::move(this_intersection));
1878  }
1879 
1880  if (verbose)
1881  {
1882  for (const auto & [proc_id, set] : proc_nodes_touched_intersections)
1883  libMesh::out << "[" << this->processor_id()
1884  << "] this->proc_nodes_touched_intersections[" << proc_id << "] has "
1885  << set.size()
1886  << " entries."
1887  << std::endl;
1888  }
1889 
1890  // The number of node communication maps is the number of other processors
1891  // with which we share nodes.
1892  this->num_node_cmaps =
1893  cast_int<int>(proc_nodes_touched_intersections.size());
1894 
1895  // We can't be connecting to more processors than exist outside
1896  // ourselves
1897  libmesh_assert_less (this->num_node_cmaps, this->n_processors());
1898 
1899  // Compute the set_union of all the preceding intersections. This will be the set of
1900  // border node IDs for this processor.
1901  for (auto & pr : proc_nodes_touched_intersections)
1902  {
1903  std::set<unsigned> & other_set = pr.second;
1904  std::set<unsigned> intermediate_result; // Don't think we can insert into one of the sets we're unioning...
1905 
1906  std::set_union(this->border_node_ids.begin(), this->border_node_ids.end(),
1907  other_set.begin(), other_set.end(),
1908  std::inserter(intermediate_result, intermediate_result.end()));
1909 
1910  // Swap our intermediate result into the final set
1911  this->border_node_ids.swap(intermediate_result);
1912  }
1913 
1914  libmesh_assert_less_equal
1915  (this->proc_nodes_touched_intersections.size(),
1916  std::size_t(this->num_node_cmaps));
1917 
1918  if (verbose)
1919  {
1920  libMesh::out << "[" << this->processor_id()
1921  << "] border_node_ids.size()=" << this->border_node_ids.size()
1922  << std::endl;
1923  }
1924  } // end scope for border node ID creation
1925 
1926  // Store the number of border node IDs to be written to Nemesis file
1927  this->num_border_nodes = cast_int<int>(this->border_node_ids.size());
1928 }
int num_node_cmaps
The number of nodal communication maps for this processor.
processor_id_type n_processors() const
std::set< unsigned > border_node_ids
The set which will eventually contain the IDs of "border nodes".
OStreamProxy out
std::map< unsigned, std::set< unsigned > > proc_nodes_touched_intersections
Another map to store sets of intersections with each other processor (other than ourself, of course).
processor_id_type processor_id() const
int num_border_nodes
The number of FEM nodes local to a processor but residing in an element which also has FEM nodes on o...

◆ compute_communication_map_parameters()

void libMesh::Nemesis_IO_Helper::compute_communication_map_parameters ( )
private

This function determines the communication map parameters which will eventually be written to file.

Definition at line 1129 of file nemesis_io_helper.C.

References elem_cmap_elem_cnts, elem_cmap_ids, node_cmap_ids, node_cmap_node_cnts, num_elem_cmaps, num_node_cmaps, libMesh::out, proc_border_elem_sets, proc_nodes_touched_intersections, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

Referenced by initialize().

1130 {
1131  // For the nodes, these are the number of entries in the sets in proc_nodes_touched_intersections
1132  // map computed above. Note: this map does not contain self-intersections so we can loop over it
1133  // directly.
1134  this->node_cmap_node_cnts.clear(); // Make sure we don't have any leftover information...
1135  this->node_cmap_ids.clear(); // Make sure we don't have any leftover information...
1136  this->node_cmap_node_cnts.resize(this->num_node_cmaps);
1137  this->node_cmap_ids.resize(this->num_node_cmaps);
1138 
1139  {
1140  unsigned cnt=0; // Index into the vector
1142  it = this->proc_nodes_touched_intersections.begin(),
1143  end = this->proc_nodes_touched_intersections.end();
1144 
1145  for (; it != end; ++it)
1146  {
1147  this->node_cmap_ids[cnt] = it->first; // The ID of the proc we communicate with
1148  this->node_cmap_node_cnts[cnt] = cast_int<int>(it->second.size()); // The number of nodes we communicate
1149  cnt++; // increment vector index!
1150  }
1151  }
1152 
1153  // Print the packed vectors we just filled
1154  if (verbose)
1155  {
1156  libMesh::out << "[" << this->processor_id() << "] node_cmap_node_cnts = ";
1157  for (const auto & node_cnt : node_cmap_node_cnts)
1158  libMesh::out << node_cnt << ", ";
1159  libMesh::out << std::endl;
1160 
1161  libMesh::out << "[" << this->processor_id() << "] node_cmap_ids = ";
1162  for (const auto & node_id : node_cmap_ids)
1163  libMesh::out << node_id << ", ";
1164  libMesh::out << std::endl;
1165  }
1166 
1167  // For the elements, we have not yet computed all this information..
1168  this->elem_cmap_elem_cnts.clear(); // Make sure we don't have any leftover information...
1169  this->elem_cmap_ids.clear(); // Make sure we don't have any leftover information...
1170  this->elem_cmap_elem_cnts.resize(this->num_elem_cmaps);
1171  this->elem_cmap_ids.resize(this->num_elem_cmaps);
1172 
1173  // Pack the elem_cmap_ids and elem_cmap_elem_cnts vectors
1174  {
1175  unsigned cnt=0; // Index into the vectors we're filling
1177  it = this->proc_border_elem_sets.begin(),
1178  end = this->proc_border_elem_sets.end();
1179 
1180  for (; it != end; ++it)
1181  {
1182  this->elem_cmap_ids[cnt] = it->first; // The ID of the proc we communicate with
1183  this->elem_cmap_elem_cnts[cnt] = cast_int<int>(it->second.size()); // The number of elems we communicate to/from that proc
1184  cnt++; // increment vector index!
1185  }
1186  }
1187 
1188  // Print the packed vectors we just filled
1189  if (verbose)
1190  {
1191  libMesh::out << "[" << this->processor_id() << "] elem_cmap_elem_cnts = ";
1192  for (const auto & elem_cnt : elem_cmap_elem_cnts)
1193  libMesh::out << elem_cnt << ", ";
1194  libMesh::out << std::endl;
1195 
1196  libMesh::out << "[" << this->processor_id() << "] elem_cmap_ids = ";
1197  for (const auto & elem_id : elem_cmap_ids)
1198  libMesh::out << elem_id << ", ";
1199  libMesh::out << std::endl;
1200  }
1201 }
std::vector< int > node_cmap_ids
Vectors for storing the communication map parameters.
int num_node_cmaps
The number of nodal communication maps for this processor.
std::map< unsigned, std::set< unsigned > >::iterator proc_nodes_touched_iterator
Typedef for an iterator into the data structure above.
std::vector< int > elem_cmap_elem_cnts
int num_elem_cmaps
The number of elemental communication maps for this processor.
OStreamProxy out
std::vector< int > elem_cmap_ids
std::vector< int > node_cmap_node_cnts
std::map< unsigned, std::set< unsigned > > proc_nodes_touched_intersections
Another map to store sets of intersections with each other processor (other than ourself, of course).
processor_id_type processor_id() const
std::map< unsigned, std::set< std::pair< unsigned, unsigned > > >::iterator proc_border_elem_sets_iterator
Typedef for an iterator into the data structure above.
std::map< unsigned, std::set< std::pair< unsigned, unsigned > > > proc_border_elem_sets
Map between processor ID and (element,side) pairs bordering that processor ID.

◆ compute_elem_communication_maps()

void libMesh::Nemesis_IO_Helper::compute_elem_communication_maps ( )
private

This function computes element communication maps (really just packs vectors) in preparation for writing them to file.

Definition at line 977 of file nemesis_io_helper.C.

References elem_cmap_elem_ids, elem_cmap_ids, elem_cmap_proc_ids, elem_cmap_side_ids, libMesh::ExodusII_IO_Helper::libmesh_elem_num_to_exodus, num_elem_cmaps, and proc_border_elem_sets.

Referenced by initialize().

978 {
979  // Make sure there is no leftover information
980  this->elem_cmap_elem_ids.clear();
981  this->elem_cmap_side_ids.clear();
982  this->elem_cmap_proc_ids.clear();
983 
984  // Allocate enough space for all our element maps
985  this->elem_cmap_elem_ids.resize(this->num_elem_cmaps);
986  this->elem_cmap_side_ids.resize(this->num_elem_cmaps);
987  this->elem_cmap_proc_ids.resize(this->num_elem_cmaps);
988  {
989  unsigned cnt=0; // Index into vectors
991  it = this->proc_border_elem_sets.begin(),
992  end = this->proc_border_elem_sets.end();
993 
994  for (; it != end; ++it)
995  {
996  // Make sure the current elem_cmap_id matches the index in our map of node intersections
997  libmesh_assert_equal_to (static_cast<unsigned>(this->elem_cmap_ids[cnt]), it->first);
998 
999  // Get reference to the set of IDs to be packed into the vector
1000  std::set<std::pair<unsigned,unsigned>> & elem_set = it->second;
1001 
1002  // Resize the vectors to receive their payload
1003  this->elem_cmap_elem_ids[cnt].resize(elem_set.size());
1004  this->elem_cmap_side_ids[cnt].resize(elem_set.size());
1005  this->elem_cmap_proc_ids[cnt].resize(elem_set.size());
1006 
1007  std::set<std::pair<unsigned,unsigned>>::iterator elem_set_iter = elem_set.begin();
1008 
1009  // Pack the vectors with elem IDs, side IDs, and processor IDs.
1010  for (std::size_t j=0, eceis=this->elem_cmap_elem_ids[cnt].size(); j<eceis; ++j, ++elem_set_iter)
1011  {
1012  this->elem_cmap_elem_ids[cnt][j] =
1013  libmesh_map_find(libmesh_elem_num_to_exodus, elem_set_iter->first);
1014  this->elem_cmap_side_ids[cnt][j] = elem_set_iter->second; // Side ID, this has already been converted above
1015  this->elem_cmap_proc_ids[cnt][j] = it->first; // All have the same processor ID
1016  }
1017 
1018  // increment vector index to go to next processor
1019  cnt++;
1020  }
1021  } // end scope for packing
1022 }
std::vector< std::vector< int > > elem_cmap_side_ids
std::vector< std::vector< int > > elem_cmap_elem_ids
3 vectors of vectors for storing element communication IDs for this processor.
std::vector< std::vector< int > > elem_cmap_proc_ids
std::map< dof_id_type, dof_id_type > libmesh_elem_num_to_exodus
int num_elem_cmaps
The number of elemental communication maps for this processor.
std::vector< int > elem_cmap_ids
std::map< unsigned, std::set< std::pair< unsigned, unsigned > > >::iterator proc_border_elem_sets_iterator
Typedef for an iterator into the data structure above.
std::map< unsigned, std::set< std::pair< unsigned, unsigned > > > proc_border_elem_sets
Map between processor ID and (element,side) pairs bordering that processor ID.

◆ compute_element_maps()

void libMesh::Nemesis_IO_Helper::compute_element_maps ( )
private

This function computes element maps (really just packs vectors) which map the elements to internal and border elements.

Definition at line 952 of file nemesis_io_helper.C.

References border_elem_ids, elem_mapb, elem_mapi, internal_elem_ids, and libMesh::ExodusII_IO_Helper::libmesh_elem_num_to_exodus.

Referenced by initialize().

953 {
954  // Make sure we don't have any leftover info
955  this->elem_mapi.clear();
956  this->elem_mapb.clear();
957 
958  // Copy set contents into vectors
959  this->elem_mapi.resize(this->internal_elem_ids.size());
960  this->elem_mapb.resize(this->border_elem_ids.size());
961 
962  {
963  unsigned cnt = 0;
964  for (const auto & id : this->internal_elem_ids)
965  this->elem_mapi[cnt++] = libmesh_map_find(libmesh_elem_num_to_exodus, id);
966  }
967 
968  {
969  unsigned cnt = 0;
970  for (const auto & id : this->border_elem_ids)
971  this->elem_mapb[cnt++] = libmesh_map_find(libmesh_elem_num_to_exodus, id);
972  }
973 }
std::set< unsigned > border_elem_ids
A set of border elem IDs for this processor.
std::map< dof_id_type, dof_id_type > libmesh_elem_num_to_exodus
std::vector< int > elem_mapb
Vector which stores border element IDs.
std::vector< int > elem_mapi
Vector which stores internal element IDs.
std::set< unsigned > internal_elem_ids
A set of internal elem IDs for this processor.

◆ compute_internal_and_border_elems_and_internal_nodes()

void libMesh::Nemesis_IO_Helper::compute_internal_and_border_elems_and_internal_nodes ( const MeshBase pmesh)
private

This function constructs the set of border and internal element IDs and internal node IDs present on the current mesh.

Definition at line 1207 of file nemesis_io_helper.C.

References border_elem_ids, border_node_ids, libMesh::ExodusII_IO_Helper::get_conversion(), internal_elem_ids, internal_node_ids, nodes_attached_to_local_elems, num_border_elems, num_border_nodes, num_elem_cmaps, num_internal_elems, num_internal_nodes, libMesh::out, proc_border_elem_sets, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

Referenced by initialize().

1208 {
1209  // Set of all local, active element IDs. After we have identified border element
1210  // IDs, the set_difference between this set and the border_elem_ids set will give us
1211  // the set of internal_elem_ids.
1212  std::set<unsigned> all_elem_ids;
1213 
1214  // A set of processor IDs which elements on this processor have as
1215  // neighbors. The size of this set will determine the number of
1216  // element communication maps in Exodus.
1217  std::set<unsigned> neighboring_processor_ids;
1218 
1219  for (const auto & elem : pmesh.active_local_element_ptr_range())
1220  {
1221  // Add this Elem's ID to all_elem_ids, later we will take the difference
1222  // between this set and the set of border_elem_ids, to get the set of
1223  // internal_elem_ids.
1224  all_elem_ids.insert(elem->id());
1225 
1226  // Will be set to true if element is determined to be a border element
1227  bool is_border_elem = false;
1228 
1229  // Construct a conversion object for this Element. This will help us map
1230  // Libmesh numberings into Nemesis numberings for sides.
1231  const auto & conv = get_conversion(elem->type());
1232 
1233  // Add all this element's node IDs to the set of all node IDs.
1234  // The set of internal_node_ids will be the set difference between
1235  // the set of all nodes and the set of border nodes.
1236  //
1237  // In addition, if any node of a local node is listed in the
1238  // border nodes list, then this element goes into the proc_border_elem_sets.
1239  // Note that there is not a 1:1 correspondence between
1240  // border_elem_ids and the entries which go into proc_border_elem_sets.
1241  // The latter is for communication purposes, ie determining which elements
1242  // should be shared between processors.
1243  for (auto node : elem->node_index_range())
1244  this->nodes_attached_to_local_elems.insert(elem->node_id(node));
1245 
1246  // Loop over element's neighbors, see if it has a neighbor which is off-processor
1247  for (auto n : elem->side_index_range())
1248  {
1249  if (elem->neighbor_ptr(n) != nullptr)
1250  {
1251  unsigned neighbor_proc_id = elem->neighbor_ptr(n)->processor_id();
1252 
1253  // If my neighbor has a different processor ID, I must be a border element.
1254  // Also track the neighboring processor ID if it is are different from our processor ID
1255  if (neighbor_proc_id != this->processor_id())
1256  {
1257  is_border_elem = true;
1258  neighboring_processor_ids.insert(neighbor_proc_id);
1259 
1260  // Convert libmesh side(n) of this element into a side ID for Nemesis
1261  unsigned nemesis_side_id = conv.get_inverse_side_map(n);
1262 
1263  if (verbose)
1264  libMesh::out << "[" << this->processor_id() << "] LibMesh side "
1265  << n
1266  << " mapped to (1-based) Exodus side "
1267  << nemesis_side_id
1268  << std::endl;
1269 
1270  // Add this element's ID and the ID of the side which is on the boundary
1271  // to the set of border elements for this processor.
1272  // Note: if the set does not already exist, this creates it.
1273  this->proc_border_elem_sets[ neighbor_proc_id ].emplace(elem->id(), nemesis_side_id);
1274  }
1275  }
1276  } // end for loop over neighbors
1277 
1278  // If we're on a border element, add it to the set
1279  if (is_border_elem)
1280  this->border_elem_ids.insert( elem->id() );
1281 
1282  } // end for loop over active local elements
1283 
1284  // Take the set_difference between all elements and border elements to get internal
1285  // element IDs
1286  std::set_difference(all_elem_ids.begin(), all_elem_ids.end(),
1287  this->border_elem_ids.begin(), this->border_elem_ids.end(),
1288  std::inserter(this->internal_elem_ids, this->internal_elem_ids.end()));
1289 
1290  // Take the set_difference between all nodes and border nodes to get internal nodes
1291  std::set_difference(this->nodes_attached_to_local_elems.begin(), this->nodes_attached_to_local_elems.end(),
1292  this->border_node_ids.begin(), this->border_node_ids.end(),
1293  std::inserter(this->internal_node_ids, this->internal_node_ids.end()));
1294 
1295  if (verbose)
1296  {
1297  libMesh::out << "[" << this->processor_id() << "] neighboring_processor_ids = ";
1298  for (const auto & id : neighboring_processor_ids)
1299  libMesh::out << id << " ";
1300  libMesh::out << std::endl;
1301  }
1302 
1303  // The size of the neighboring_processor_ids set should be the number of element communication maps
1304  this->num_elem_cmaps =
1305  cast_int<int>(neighboring_processor_ids.size());
1306 
1307  if (verbose)
1308  libMesh::out << "[" << this->processor_id() << "] "
1309  << "Number of neighboring processor IDs="
1310  << this->num_elem_cmaps
1311  << std::endl;
1312 
1313  if (verbose)
1314  {
1315  // Print out counts of border elements for each processor
1316  for (const auto & [proc_id, set] : proc_border_elem_sets)
1317  {
1318  libMesh::out << "[" << this->processor_id() << "] "
1319  << "Proc "
1320  << proc_id << " communicates "
1321  << set.size() << " elements." << std::endl;
1322  }
1323  }
1324 
1325  // Store the number of internal and border elements, and the number of internal nodes,
1326  // to be written to the Nemesis file.
1327  this->num_internal_elems =
1328  cast_int<int>(this->internal_elem_ids.size());
1329  this->num_border_elems =
1330  cast_int<int>(this->border_elem_ids.size());
1331  this->num_internal_nodes =
1332  cast_int<int>(this->internal_node_ids.size());
1333 
1334  if (verbose)
1335  {
1336  libMesh::out << "[" << this->processor_id() << "] num_internal_nodes=" << this->num_internal_nodes << std::endl;
1337  libMesh::out << "[" << this->processor_id() << "] num_border_nodes=" << this->num_border_nodes << std::endl;
1338  libMesh::out << "[" << this->processor_id() << "] num_border_elems=" << this->num_border_elems << std::endl;
1339  libMesh::out << "[" << this->processor_id() << "] num_internal_elems=" << this->num_internal_elems << std::endl;
1340  }
1341 }
const ExodusII_IO_Helper::Conversion & get_conversion(const ElemType type) const
std::set< unsigned > border_elem_ids
A set of border elem IDs for this processor.
std::set< unsigned > internal_node_ids
A set of internal node IDs for this processor.
std::set< unsigned > border_node_ids
The set which will eventually contain the IDs of "border nodes".
std::set< int > nodes_attached_to_local_elems
libMesh numbered node ids attached to local elems.
int num_internal_elems
The number of internal FEM elements.
int num_elem_cmaps
The number of elemental communication maps for this processor.
OStreamProxy out
processor_id_type processor_id() const
std::map< unsigned, std::set< std::pair< unsigned, unsigned > > > proc_border_elem_sets
Map between processor ID and (element,side) pairs bordering that processor ID.
int num_border_nodes
The number of FEM nodes local to a processor but residing in an element which also has FEM nodes on o...
int num_internal_nodes
To be used with the Nemesis::ne_get_loadbal_param() routine.
std::set< unsigned > internal_elem_ids
A set of internal elem IDs for this processor.
int num_border_elems
The number of border FEM elements.

◆ compute_node_communication_maps()

void libMesh::Nemesis_IO_Helper::compute_node_communication_maps ( )
private

Compute the node communication maps (really just pack vectors) in preparation for writing them to file.

Definition at line 1057 of file nemesis_io_helper.C.

References libMesh::index_range(), libMesh::ExodusII_IO_Helper::libmesh_node_num_to_exodus, node_cmap_ids, node_cmap_node_ids, node_cmap_proc_ids, node_set, num_node_cmaps, libMesh::out, proc_nodes_touched_intersections, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

Referenced by initialize().

1058 {
1059  // Make sure there's no left-over information
1060  this->node_cmap_node_ids.clear();
1061  this->node_cmap_proc_ids.clear();
1062 
1063  libmesh_assert_less_equal
1064  (this->proc_nodes_touched_intersections.size(),
1065  std::size_t(this->num_node_cmaps));
1066 
1067  // Allocate enough space for all our node maps
1068  this->node_cmap_node_ids.resize(this->num_node_cmaps);
1069  this->node_cmap_proc_ids.resize(this->num_node_cmaps);
1070  {
1071  unsigned cnt=0; // Index into vectors
1073  it = this->proc_nodes_touched_intersections.begin(),
1074  end = this->proc_nodes_touched_intersections.end();
1075 
1076  for (; it != end; ++it)
1077  {
1078  // Make sure the current node_cmap_id matches the index in our map of node intersections
1079  libmesh_assert_equal_to (static_cast<unsigned>(this->node_cmap_ids[cnt]), it->first);
1080 
1081  // Get reference to the set of IDs to be packed into the vector.
1082  std::set<unsigned> & node_set = it->second;
1083 
1084  // Resize the vectors to receive their payload
1085  this->node_cmap_node_ids[cnt].resize(node_set.size());
1086  this->node_cmap_proc_ids[cnt].resize(node_set.size());
1087 
1088  std::set<unsigned>::iterator node_set_iter = node_set.begin();
1089 
1090  // Pack the vectors with node IDs and processor IDs.
1091  for (std::size_t j=0, nceis=this->node_cmap_node_ids[cnt].size(); j<nceis; ++j, ++node_set_iter)
1092  {
1093  this->node_cmap_node_ids[cnt][j] =
1094  libmesh_map_find(libmesh_node_num_to_exodus, *node_set_iter);
1095  this->node_cmap_proc_ids[cnt][j] = it->first;
1096  }
1097 
1098  // increment vector index to go to next processor
1099  cnt++;
1100  }
1101  } // end scope for packing
1102 
1103  // Print out the vectors we just packed
1104  if (verbose)
1105  {
1106  for (auto i : index_range(this->node_cmap_node_ids))
1107  {
1108  libMesh::out << "[" << this->processor_id() << "] nodes communicated to proc "
1109  << this->node_cmap_ids[i]
1110  << " = ";
1111  for (const auto & node_id : this->node_cmap_node_ids[i])
1112  libMesh::out << node_id << " ";
1113  libMesh::out << std::endl;
1114  }
1115 
1116  for (const auto & id_vec : this->node_cmap_node_ids)
1117  {
1118  libMesh::out << "[" << this->processor_id() << "] processor ID node communicated to = ";
1119  for (const auto & proc_id : id_vec)
1120  libMesh::out << proc_id << " ";
1121  libMesh::out << std::endl;
1122  }
1123  }
1124 }
std::vector< int > node_cmap_ids
Vectors for storing the communication map parameters.
int num_node_cmaps
The number of nodal communication maps for this processor.
std::vector< std::vector< int > > node_cmap_proc_ids
std::map< dof_id_type, dof_id_type > libmesh_node_num_to_exodus
std::map< unsigned, std::set< unsigned > >::iterator proc_nodes_touched_iterator
Typedef for an iterator into the data structure above.
std::unordered_set< const Node * > & node_set
Definition: mesh_tools.C:2391
OStreamProxy out
std::map< unsigned, std::set< unsigned > > proc_nodes_touched_intersections
Another map to store sets of intersections with each other processor (other than ourself, of course).
std::vector< std::vector< int > > node_cmap_node_ids
2 vectors of vectors for storing the node communication IDs for this processor.
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153

◆ compute_node_maps()

void libMesh::Nemesis_IO_Helper::compute_node_maps ( )
private

Compute the node maps (really just pack vectors) which map the nodes to internal, border, and external nodes in the file.

Definition at line 1028 of file nemesis_io_helper.C.

References border_node_ids, internal_node_ids, libMesh::ExodusII_IO_Helper::libmesh_node_num_to_exodus, node_mapb, node_mape, and node_mapi.

Referenced by initialize().

1029 {
1030  // Make sure we don't have any leftover information
1031  this->node_mapi.clear();
1032  this->node_mapb.clear();
1033  this->node_mape.clear();
1034 
1035  // Make sure there's enough space to hold all our node IDs
1036  this->node_mapi.resize(this->internal_node_ids.size());
1037  this->node_mapb.resize(this->border_node_ids.size());
1038 
1039  // Copy set contents into vectors
1040  {
1041  unsigned cnt = 0;
1042  for (const auto & id : this->internal_node_ids)
1043  this->node_mapi[cnt++] = libmesh_map_find(libmesh_node_num_to_exodus, id);
1044  }
1045 
1046  {
1047  unsigned cnt=0;
1048  for (const auto & id : this->border_node_ids)
1049  this->node_mapb[cnt++] = libmesh_map_find(libmesh_node_num_to_exodus, id);
1050  }
1051 }
std::vector< int > node_mape
Vector which stores external node IDs.
std::map< dof_id_type, dof_id_type > libmesh_node_num_to_exodus
std::set< unsigned > internal_node_ids
A set of internal node IDs for this processor.
std::vector< int > node_mapi
Vector which stores internal node IDs.
std::set< unsigned > border_node_ids
The set which will eventually contain the IDs of "border nodes".
std::vector< int > node_mapb
Vector which stores border node IDs.

◆ compute_num_global_elem_blocks()

void libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks ( const MeshBase pmesh)

This function uses global communication routines to determine the number of element blocks across the entire mesh.

Definition at line 1549 of file nemesis_io_helper.C.

References TIMPI::Communicator::allgather(), libMesh::ParallelObject::comm(), global_elem_blk_cnts, global_elem_blk_ids, local_subdomain_counts, num_elem_blks_global, libMesh::out, libMesh::ParallelObject::processor_id(), TIMPI::Communicator::sum(), and libMesh::ExodusII_IO_Helper::verbose.

Referenced by initialize().

1550 {
1551  // 1.) Loop over active local elements, build up set of subdomain IDs.
1552  std::set<subdomain_id_type> global_subdomain_ids;
1553 
1554  // This map keeps track of the number of elements in each subdomain over all processors
1555  std::map<subdomain_id_type, unsigned> global_subdomain_counts;
1556 
1557  for (const auto & elem : pmesh.active_local_element_ptr_range())
1558  {
1559  subdomain_id_type cur_subdomain = elem->subdomain_id();
1560 
1561  /*
1562  // We can't have a zero subdomain ID in Exodus (for some reason?)
1563  // so map zero subdomains to a max value...
1564  if (cur_subdomain == 0)
1565  cur_subdomain = std::numeric_limits<subdomain_id_type>::max();
1566  */
1567 
1568  global_subdomain_ids.insert(cur_subdomain);
1569 
1570  // Increment the count of elements in this subdomain
1571  global_subdomain_counts[cur_subdomain]++;
1572  }
1573 
1574  // We're next going to this->comm().sum the subdomain counts, so save the local counts
1575  this->local_subdomain_counts = global_subdomain_counts;
1576 
1577  {
1578  // 2.) Copy local subdomain IDs into a vector for communication
1579  std::vector<subdomain_id_type> global_subdomain_ids_vector(global_subdomain_ids.begin(),
1580  global_subdomain_ids.end());
1581 
1582  // 3.) Gather them into an enlarged vector
1583  this->comm().allgather(global_subdomain_ids_vector);
1584 
1585  // 4.) Insert any new IDs into the set (any duplicates will be dropped)
1586  global_subdomain_ids.insert(global_subdomain_ids_vector.begin(),
1587  global_subdomain_ids_vector.end());
1588  }
1589 
1590  // 5.) Now global_subdomain_ids actually contains a global list of all subdomain IDs
1591  this->num_elem_blks_global =
1592  cast_int<int>(global_subdomain_ids.size());
1593 
1594  // Print the number of elements found locally in each subdomain
1595  if (verbose)
1596  {
1597  libMesh::out << "[" << this->processor_id() << "] ";
1598  for (const auto & [subdomain_id, cnt] : global_subdomain_counts)
1599  {
1600  libMesh::out << "ID: "
1601  << static_cast<unsigned>(subdomain_id)
1602  << ", Count: " << cnt << ", ";
1603  }
1604  libMesh::out << std::endl;
1605  }
1606 
1607  // 6.) this->comm().sum up the number of elements in each block. We know the global
1608  // subdomain IDs, so pack them into a vector one by one. Use a vector of int since
1609  // that is what Nemesis wants
1610  this->global_elem_blk_cnts.resize(global_subdomain_ids.size());
1611 
1612  unsigned cnt=0;
1613  // Find the entry in the local map, note: if not found, will be created with 0 default value, which is OK...
1614  for (const auto & id : global_subdomain_ids)
1615  this->global_elem_blk_cnts[cnt++] = global_subdomain_counts[id];
1616 
1617  // Sum up subdomain counts from all processors
1618  this->comm().sum(this->global_elem_blk_cnts);
1619 
1620  if (verbose)
1621  {
1622  libMesh::out << "[" << this->processor_id() << "] global_elem_blk_cnts = ";
1623  for (const auto & bc : this->global_elem_blk_cnts)
1624  libMesh::out << bc << ", ";
1625  libMesh::out << std::endl;
1626  }
1627 
1628  // 7.) Create a vector<int> from the global_subdomain_ids set, for passing to Nemesis
1629  this->global_elem_blk_ids.clear();
1630  this->global_elem_blk_ids.insert(this->global_elem_blk_ids.end(), // pos
1631  global_subdomain_ids.begin(),
1632  global_subdomain_ids.end());
1633 
1634  if (verbose)
1635  {
1636  libMesh::out << "[" << this->processor_id() << "] global_elem_blk_ids = ";
1637  for (const auto & id : this->global_elem_blk_ids)
1638  libMesh::out << id << ", ";
1639  libMesh::out << std::endl;
1640  }
1641 
1642 
1643  // 8.) We will call put_eb_info_global later, it must be called after this->put_init_global().
1644 }
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
TestClass subdomain_id_type
Based on the 4-byte comment warning above, this probably doesn&#39;t work with exodusII at all...
Definition: id_types.h:43
void sum(T &r) const
const Parallel::Communicator & comm() const
std::vector< int > global_elem_blk_ids
Read the global element block IDs and counts.
std::map< subdomain_id_type, unsigned > local_subdomain_counts
This map keeps track of the number of elements in each subdomain (block) for this processor...
OStreamProxy out
processor_id_type processor_id() const
std::vector< int > global_elem_blk_cnts

◆ compute_num_global_nodesets()

void libMesh::Nemesis_IO_Helper::compute_num_global_nodesets ( const MeshBase pmesh)
private

This function uses global communication routines to determine the number of nodesets across the entire mesh.

Definition at line 1438 of file nemesis_io_helper.C.

References libMesh::BoundaryInfo::build_node_list(), libMesh::ParallelObject::comm(), libMesh::MeshBase::get_boundary_info(), libMesh::BoundaryInfo::get_node_boundary_ids(), global_nodeset_ids, libMesh::index_range(), libMesh::MeshBase::node_ptr(), num_global_node_counts, num_node_sets_global, libMesh::out, libMesh::ParallelObject::processor_id(), libMesh::DofObject::processor_id(), TIMPI::Communicator::set_union(), TIMPI::Communicator::sum(), and libMesh::ExodusII_IO_Helper::verbose.

Referenced by initialize().

1439 {
1440  std::set<boundary_id_type> local_node_boundary_ids;
1441 
1442  // 1.) Get reference to the set of node boundary IDs *for this processor*
1443  std::set<boundary_id_type> global_node_boundary_ids
1444  (pmesh.get_boundary_info().get_node_boundary_ids().begin(),
1445  pmesh.get_boundary_info().get_node_boundary_ids().end());
1446 
1447  // Save a copy of the local_node_boundary_ids...
1448  local_node_boundary_ids = global_node_boundary_ids;
1449 
1450  // 2.) Gather boundary node IDs from other processors
1451  this->comm().set_union(global_node_boundary_ids);
1452 
1453  // 3.) Now global_node_boundary_ids actually contains a global list of all node boundary IDs
1454  this->num_node_sets_global =
1455  cast_int<int>(global_node_boundary_ids.size());
1456 
1457  // 4.) Create a vector<int> from the global_node_boundary_ids set
1458  this->global_nodeset_ids.clear();
1459  this->global_nodeset_ids.insert(this->global_nodeset_ids.end(),
1460  global_node_boundary_ids.begin(),
1461  global_node_boundary_ids.end());
1462 
1463  if (verbose)
1464  {
1465  libMesh::out << "[" << this->processor_id() << "] global_nodeset_ids = ";
1466  for (const auto & id : global_nodeset_ids)
1467  libMesh::out << id << ", ";
1468  libMesh::out << std::endl;
1469 
1470  libMesh::out << "[" << this->processor_id() << "] local_node_boundary_ids = ";
1471  for (const auto & id : local_node_boundary_ids)
1472  libMesh::out << id << ", ";
1473  libMesh::out << std::endl;
1474  }
1475 
1476  // 7.) We also need to know the number of nodes which is in each of the nodesets, globally.
1477 
1478  // Build list of (node-id, bc-id) tuples.
1479  typedef std::tuple<dof_id_type, boundary_id_type> Tuple;
1480  std::vector<Tuple> bc_tuples = pmesh.get_boundary_info().build_node_list();
1481 
1482  if (verbose)
1483  {
1484  libMesh::out << "[" << this->processor_id() << "] boundary_node_list.size()="
1485  << bc_tuples.size() << std::endl;
1486  libMesh::out << "[" << this->processor_id() << "] (boundary_node_id, boundary_id) = ";
1487  for (const auto & t : bc_tuples)
1488  libMesh::out << "(" << std::get<0>(t) << ", " << std::get<1>(t) << ") ";
1489  libMesh::out << std::endl;
1490  }
1491 
1492  // Now get the global information. In this case, we only want to count boundary
1493  // information for nodes *owned* by this processor, so there are no duplicates.
1494 
1495  // Make sure we don't have any left over information
1496  this->num_global_node_counts.clear();
1497  this->num_global_node_counts.resize(this->global_nodeset_ids.size());
1498 
1499  // Unfortunately, we can't just count up all occurrences of a given id,
1500  // that would give us duplicate entries when we do the parallel summation.
1501  // So instead, only count entries for nodes owned by this processor.
1502  // Start by getting rid of all non-local node entries from the vectors.
1503  std::vector<Tuple>::iterator
1504  it = bc_tuples.begin(),
1505  new_end = bc_tuples.end();
1506 
1507  while (it != new_end)
1508  {
1509  if (pmesh.node_ptr(std::get<0>(*it))->processor_id() != this->processor_id())
1510  {
1511  // Back up the new end iterators to prepare for swap
1512  --new_end;
1513 
1514  // Swap places, the non-local node will now be "past-the-end"
1515  std::swap(*it, *new_end);
1516  }
1517  else // node is local, go to next
1518  ++it;
1519  }
1520 
1521  // Erase from "new" end to old end.
1522  bc_tuples.erase(new_end, bc_tuples.end());
1523 
1524  // Now we can do the local count for each ID...
1525  for (auto i : index_range(global_nodeset_ids))
1526  {
1527  int id = this->global_nodeset_ids[i];
1528  this->num_global_node_counts[i] =
1529  cast_int<int>(std::count_if(bc_tuples.begin(),
1530  bc_tuples.end(),
1531  [id](const Tuple & t)->bool { return std::get<1>(t) == id; }));
1532  }
1533 
1534  // And finally we can sum them up
1535  this->comm().sum(this->num_global_node_counts);
1536 
1537  if (verbose)
1538  {
1539  libMesh::out << "[" << this->processor_id() << "] num_global_node_counts = ";
1540  for (const auto & cnt : num_global_node_counts)
1541  libMesh::out << cnt << ", ";
1542  libMesh::out << std::endl;
1543  }
1544 }
std::vector< int > num_global_node_counts
std::vector< int > global_nodeset_ids
Containers for reading global nodeset information.
void sum(T &r) const
const Parallel::Communicator & comm() const
OStreamProxy out
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153
void set_union(T &data, const unsigned int root_id) const

◆ compute_num_global_sidesets()

void libMesh::Nemesis_IO_Helper::compute_num_global_sidesets ( const MeshBase pmesh)
private

This function uses global communication routines to determine the number of sidesets across the entire mesh.

Definition at line 1345 of file nemesis_io_helper.C.

References libMesh::BoundaryInfo::build_side_list(), libMesh::ParallelObject::comm(), libMesh::MeshBase::elem_ref(), libMesh::MeshBase::get_boundary_info(), libMesh::BoundaryInfo::get_side_boundary_ids(), global_sideset_ids, libMesh::index_range(), num_global_side_counts, num_side_sets_global, libMesh::out, libMesh::ParallelObject::processor_id(), libMesh::DofObject::processor_id(), TIMPI::Communicator::set_union(), TIMPI::Communicator::sum(), and libMesh::ExodusII_IO_Helper::verbose.

Referenced by initialize().

1346 {
1347  // 1.) Get reference to the set of side boundary IDs
1348  std::set<boundary_id_type> global_side_boundary_ids
1349  (pmesh.get_boundary_info().get_side_boundary_ids().begin(),
1350  pmesh.get_boundary_info().get_side_boundary_ids().end());
1351 
1352  // 2.) Gather boundary side IDs from other processors
1353  this->comm().set_union(global_side_boundary_ids);
1354 
1355  // 3.) Now global_side_boundary_ids actually contains a global list of all side boundary IDs
1356  this->num_side_sets_global =
1357  cast_int<int>(global_side_boundary_ids.size());
1358 
1359  // 4.) Pack these sidesets into a vector so they can be written by Nemesis
1360  this->global_sideset_ids.clear(); // Make sure there is no leftover information
1361  this->global_sideset_ids.insert(this->global_sideset_ids.end(),
1362  global_side_boundary_ids.begin(),
1363  global_side_boundary_ids.end());
1364 
1365  if (verbose)
1366  {
1367  libMesh::out << "[" << this->processor_id() << "] global_sideset_ids = ";
1368  for (const auto & id : this->global_sideset_ids)
1369  libMesh::out << id << ", ";
1370  libMesh::out << std::endl;
1371  }
1372 
1373  // We also need global counts of sides in each of the sidesets.
1374  // Build a list of (elem, side, bc) tuples.
1375  typedef std::tuple<dof_id_type, unsigned short int, boundary_id_type> Tuple;
1376  std::vector<Tuple> bc_triples = pmesh.get_boundary_info().build_side_list();
1377 
1378  // Iterators to the beginning and end of the current range.
1379  std::vector<Tuple>::iterator
1380  it = bc_triples.begin(),
1381  new_end = bc_triples.end();
1382 
1383  while (it != new_end)
1384  {
1385  if (pmesh.elem_ref(std::get<0>(*it)).processor_id() != this->processor_id())
1386  {
1387  // Back up the new end iterators to prepare for swap
1388  --new_end;
1389 
1390  // Swap places, the non-local elem will now be "past-the-end"
1391  std::swap (*it, *new_end);
1392  }
1393  else // elem is local, go to next
1394  ++it;
1395  }
1396 
1397  // Erase from "new" end to old.
1398  bc_triples.erase(new_end, bc_triples.end());
1399 
1400  this->num_global_side_counts.clear(); // Make sure we don't have any leftover information
1401  this->num_global_side_counts.resize(this->global_sideset_ids.size());
1402 
1403  // Get the count for each global sideset ID
1404  for (auto i : index_range(global_sideset_ids))
1405  {
1406  int id = global_sideset_ids[i];
1407  this->num_global_side_counts[i] =
1408  cast_int<int>(std::count_if(bc_triples.begin(),
1409  bc_triples.end(),
1410  [id](const Tuple & t)->bool { return std::get<2>(t) == id; }));
1411  }
1412 
1413  if (verbose)
1414  {
1415  libMesh::out << "[" << this->processor_id() << "] num_global_side_counts = ";
1416  for (const auto & cnt : this->num_global_side_counts)
1417  libMesh::out << cnt << ", ";
1418  libMesh::out << std::endl;
1419  }
1420 
1421  // Finally sum up the result
1422  this->comm().sum(this->num_global_side_counts);
1423 
1424  if (verbose)
1425  {
1426  libMesh::out << "[" << this->processor_id() << "] num_global_side_counts = ";
1427  for (const auto & cnt : this->num_global_side_counts)
1428  libMesh::out << cnt << ", ";
1429  libMesh::out << std::endl;
1430  }
1431 }
std::vector< int > global_sideset_ids
Containers for reading global sideset (boundary conditions) information.
void sum(T &r) const
const Parallel::Communicator & comm() const
std::vector< int > num_global_side_counts
OStreamProxy out
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153
void set_union(T &data, const unsigned int root_id) const

◆ conditionally_set_elem_unique_id()

void libMesh::ExodusII_IO_Helper::conditionally_set_elem_unique_id ( MeshBase mesh,
Elem elem,
int  zero_based_elem_num_map_index 
)
inherited

Definition at line 2237 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::elem_num_map, and libMesh::ExodusII_IO_Helper::set_dof_object_unique_id().

2238 {
2239  this->set_dof_object_unique_id(mesh, elem, libmesh_vector_at(this->elem_num_map, zero_based_elem_num_map_index));
2240 }
void set_dof_object_unique_id(MeshBase &mesh, DofObject *dof_object, int exodus_mapped_id)

◆ conditionally_set_node_unique_id()

void libMesh::ExodusII_IO_Helper::conditionally_set_node_unique_id ( MeshBase mesh,
Node node,
int  zero_based_node_num_map_index 
)
inherited

Helper function that conditionally sets the unique_id of the passed-in Node/Elem.

Calling this function does nothing if _set_unique_ids_from_maps == false, otherwise it sets the unique_id based on the entries of the {node,elem_num_map}. The input index is assumed to be a zero-based index into the {node,elem}_num_map array.

Definition at line 2230 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::node_num_map, and libMesh::ExodusII_IO_Helper::set_dof_object_unique_id().

2231 {
2232  this->set_dof_object_unique_id(mesh, node, libmesh_vector_at(this->node_num_map, zero_based_node_num_map_index));
2233 }
void set_dof_object_unique_id(MeshBase &mesh, DofObject *dof_object, int exodus_mapped_id)

◆ construct_nemesis_filename()

std::string libMesh::Nemesis_IO_Helper::construct_nemesis_filename ( std::string_view  base_filename)

Given base_filename, foo.e, constructs the Nemesis filename foo.e.X.Y, where X=n.

CPUs and Y=processor ID

Definition at line 2789 of file nemesis_io_helper.C.

References libMesh::ParallelObject::n_processors(), libMesh::out, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

2790 {
2791  // Build a filename for this processor. This code is cut-n-pasted from the read function
2792  // and should probably be put into a separate function...
2793  std::ostringstream file_oss;
2794 
2795  // We have to be a little careful here: Nemesis left pads its file
2796  // numbers based on the number of processors, so for example on 10
2797  // processors, we'd have:
2798  // mesh.e.10.00
2799  // mesh.e.10.01
2800  // mesh.e.10.02
2801  // ...
2802  // mesh.e.10.09
2803 
2804  // And on 100 you'd have:
2805  // mesh.e.100.000
2806  // mesh.e.100.001
2807  // ...
2808  // mesh.e.128.099
2809 
2810  // Find the length of the highest processor ID
2811  file_oss << (this->n_processors());
2812  unsigned int field_width = cast_int<unsigned int>(file_oss.str().size());
2813 
2814  if (verbose)
2815  libMesh::out << "field_width=" << field_width << std::endl;
2816 
2817  file_oss.str(""); // reset the string stream
2818  file_oss << base_filename
2819  << '.' << this->n_processors()
2820  << '.' << std::setfill('0') << std::setw(field_width) << this->processor_id();
2821 
2822  // Return the resulting string
2823  return file_oss.str();
2824 }
processor_id_type n_processors() const
OStreamProxy out
processor_id_type processor_id() const

◆ create()

void libMesh::ExodusII_IO_Helper::create ( std::string  filename)
virtualinherited

Opens an ExodusII mesh file named filename for writing.

Definition at line 2280 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_max_name_length, libMesh::ExodusII_IO_Helper::_opened_by_create, libMesh::ExodusII_IO_Helper::_run_only_on_proc0, libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::_write_hdf5, libMesh::ExodusII_IO_Helper::current_filename, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::opened_for_writing, libMesh::out, libMesh::ParallelObject::processor_id(), libMesh::Real, and libMesh::ExodusII_IO_Helper::verbose.

2281 {
2282  // If we're processor 0, always create the file.
2283  // If we running on all procs, e.g. as one of several Nemesis files, also
2284  // call create there.
2285  if ((this->processor_id() == 0) || (!_run_only_on_proc0))
2286  {
2287  int
2288  comp_ws = 0,
2289  io_ws = 0;
2290 
2291  if (_single_precision)
2292  {
2293  comp_ws = cast_int<int>(sizeof(float));
2294  io_ws = cast_int<int>(sizeof(float));
2295  }
2296  // Fall back on double precision when necessary since ExodusII
2297  // doesn't seem to support long double
2298  else
2299  {
2300  comp_ws = cast_int<int>
2301  (std::min(sizeof(Real), sizeof(double)));
2302  io_ws = cast_int<int>
2303  (std::min(sizeof(Real), sizeof(double)));
2304  }
2305 
2306  // By default we just open the Exodus file in "EX_CLOBBER" mode,
2307  // which, according to "ncdump -k", writes the file in "64-bit
2308  // offset" mode, which is a NETCDF3 file format.
2309  int mode = EX_CLOBBER;
2310 
2311  // If HDF5 is available, by default we will write Exodus files
2312  // in a more modern NETCDF4-compatible format. For this file
2313  // type, "ncdump -k" will report "netCDF-4".
2314 #ifdef LIBMESH_HAVE_HDF5
2315  if (this->_write_hdf5)
2316  {
2317  mode |= EX_NETCDF4;
2318  mode |= EX_NOCLASSIC;
2319  }
2320 #endif
2321 
2322  {
2323  FPEDisabler disable_fpes;
2324  ex_id = exII::ex_create(filename.c_str(), mode, &comp_ws, &io_ws);
2325  }
2326 
2327  EX_CHECK_ERR(ex_id, "Error creating ExodusII/Nemesis mesh file.");
2328 
2329  // We don't have access to the names we might be writing until we
2330  // write them, so we can't set a guaranteed max name length here.
2331  // But it looks like the most ExodusII can support is 80, so we'll
2332  // just waste 48 bytes here and there.
2333  ex_err = exII::ex_set_max_name_length(ex_id, _max_name_length);
2334  EX_CHECK_ERR(ex_err, "Error setting max ExodusII name length.");
2335 
2336  if (verbose)
2337  libMesh::out << "File created successfully." << std::endl;
2338  }
2339 
2340  opened_for_writing = true;
2341  _opened_by_create = true;
2342  current_filename = filename;
2343 }
The FPEDisabler class puts Floating-Point Exception (FPE) trapping on hold during its lifetime...
Definition: fpe_disabler.h:49
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
OStreamProxy out
processor_id_type processor_id() const

◆ end_elem_id()

int libMesh::ExodusII_IO_Helper::end_elem_id ( ) const
inlineinherited

◆ get_add_sides()

bool libMesh::ExodusII_IO_Helper::get_add_sides ( )
inlineinherited

Definition at line 1347 of file exodusII_io_helper.h.

References libMesh::ExodusII_IO_Helper::_add_sides.

1348 {
1349  return _add_sides;
1350 }
bool _add_sides
Set to true iff we want to write separate "side" elements too.

◆ get_block_id()

int libMesh::ExodusII_IO_Helper::get_block_id ( int  index)
inherited

Get the block number for the given block index.

Definition at line 1121 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::block_ids.

Referenced by libMesh::ExodusII_IO_Helper::write_element_values(), and libMesh::ExodusII_IO_Helper::write_element_values_element_major().

1122 {
1123  libmesh_assert_less (index, block_ids.size());
1124 
1125  return block_ids[index];
1126 }

◆ get_block_name()

std::string libMesh::ExodusII_IO_Helper::get_block_name ( int  index)
inherited

Get the block name for the given block index if supplied in the mesh file.

Otherwise an empty string is returned.

Definition at line 1130 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::block_ids, and libMesh::ExodusII_IO_Helper::id_to_block_names.

1131 {
1132  libmesh_assert_less (index, block_ids.size());
1133 
1134  return id_to_block_names[block_ids[index]];
1135 }
std::map< int, std::string > id_to_block_names

◆ get_cmap_params()

void libMesh::Nemesis_IO_Helper::get_cmap_params ( )

Definition at line 388 of file nemesis_io_helper.C.

References elem_cmap_elem_cnts, elem_cmap_ids, libMesh::ExodusII_IO_Helper::ex_id, libMesh::index_range(), nemesis_err_flag, node_cmap_ids, node_cmap_node_cnts, num_elem_cmaps, num_node_cmaps, libMesh::out, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

389 {
394 
396  Nemesis::ne_get_cmap_params(ex_id,
397  node_cmap_ids.empty() ? nullptr : node_cmap_ids.data(),
398  node_cmap_node_cnts.empty() ? nullptr : node_cmap_node_cnts.data(),
399  elem_cmap_ids.empty() ? nullptr : elem_cmap_ids.data(),
400  elem_cmap_elem_cnts.empty() ? nullptr : elem_cmap_elem_cnts.data(),
401  this->processor_id());
402  EX_CHECK_ERR(nemesis_err_flag, "Error reading cmap parameters!");
403 
404 
405  if (verbose)
406  {
407  libMesh::out << "[" << this->processor_id() << "] ";
408  for (auto i : index_range(node_cmap_ids))
409  libMesh::out << "node_cmap_ids[" << i << "]=" << node_cmap_ids[i] << " ";
410  libMesh::out << std::endl;
411 
412  libMesh::out << "[" << this->processor_id() << "] ";
413  for (auto i : index_range(node_cmap_node_cnts))
414  libMesh::out << "node_cmap_node_cnts[" << i << "]=" << node_cmap_node_cnts[i] << " ";
415  libMesh::out << std::endl;
416 
417  libMesh::out << "[" << this->processor_id() << "] ";
418  for (auto i : index_range(elem_cmap_ids))
419  libMesh::out << "elem_cmap_ids[" << i << "]=" << elem_cmap_ids[i] << " ";
420  libMesh::out << std::endl;
421 
422  libMesh::out << "[" << this->processor_id() << "] ";
423  for (auto i : index_range(elem_cmap_elem_cnts))
424  libMesh::out << "elem_cmap_elem_cnts[" << i << "]=" << elem_cmap_elem_cnts[i] << " ";
425  libMesh::out << std::endl;
426  }
427 }
std::vector< int > node_cmap_ids
Vectors for storing the communication map parameters.
int nemesis_err_flag
Member data.
int num_node_cmaps
The number of nodal communication maps for this processor.
std::vector< int > elem_cmap_elem_cnts
int num_elem_cmaps
The number of elemental communication maps for this processor.
OStreamProxy out
std::vector< int > elem_cmap_ids
std::vector< int > node_cmap_node_cnts
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153

◆ get_complex_names()

std::vector< std::string > libMesh::ExodusII_IO_Helper::get_complex_names ( const std::vector< std::string > &  names,
bool  write_complex_abs 
) const
inherited
Returns
A vector with three copies of each element in the provided name vector, starting with r_, i_ and a_ respectively. If the "write_complex_abs" parameter is true (default), the complex modulus is written, otherwise only the real and imaginary parts are written.

Definition at line 4879 of file exodusII_io_helper.C.

References libMesh::Quality::name().

4881 {
4882  std::vector<std::string> complex_names;
4883 
4884  // This will loop over all names and create new "complex" names
4885  // (i.e. names that start with r_, i_ or a_)
4886  for (const auto & name : names)
4887  {
4888  complex_names.push_back("r_" + name);
4889  complex_names.push_back("i_" + name);
4890  if (write_complex_abs)
4891  complex_names.push_back("a_" + name);
4892  }
4893 
4894  return complex_names;
4895 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42

◆ get_complex_subdomain_to_var_names()

std::map< subdomain_id_type, std::vector< std::string > > libMesh::ExodusII_IO_Helper::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
inherited

Takes a map from subdomain id -> vector of active variable names as input and returns a corresponding map where the original variable names have been replaced by their complex counterparts.

Used by the ExodusII_IO::write_element_data_from_discontinuous_nodal_data() function.

Definition at line 4925 of file exodusII_io_helper.C.

4927 {
4928  // Eventual return value
4929  std::map<subdomain_id_type, std::vector<std::string>> ret;
4930 
4931  unsigned int num_complex_outputs = write_complex_abs ? 3 : 2;
4932 
4933  for (const auto & pr : subdomain_to_var_names)
4934  {
4935  // Initialize entry for current subdomain
4936  auto & vec = ret[pr.first];
4937 
4938  // Get list of non-complex variable names active on this subdomain.
4939  const auto & varnames = pr.second;
4940 
4941  // Allocate space for the complex-valued entries
4942  vec.reserve(num_complex_outputs * varnames.size());
4943 
4944  // For each varname in the input map, write three variable names
4945  // to the output formed by prepending "r_", "i_", and "a_",
4946  // respectively.
4947  for (const auto & varname : varnames)
4948  {
4949  vec.push_back("r_" + varname);
4950  vec.push_back("i_" + varname);
4951  if (write_complex_abs)
4952  vec.push_back("a_" + varname);
4953  }
4954  }
4955  return ret;
4956 }

◆ get_complex_vars_active_subdomains()

std::vector< std::set< subdomain_id_type > > libMesh::ExodusII_IO_Helper::get_complex_vars_active_subdomains ( const std::vector< std::set< subdomain_id_type >> &  vars_active_subdomains,
bool  write_complex_abs 
) const
inherited

returns a "tripled" copy of vars_active_subdomains, which is necessary in the complex-valued case.

Definition at line 4902 of file exodusII_io_helper.C.

4904 {
4905  std::vector<std::set<subdomain_id_type>> complex_vars_active_subdomains;
4906 
4907  for (auto & s : vars_active_subdomains)
4908  {
4909  // Push back the same data enough times for the real, imag, (and
4910  // possibly modulus) for the complex-valued solution.
4911  complex_vars_active_subdomains.push_back(s);
4912  complex_vars_active_subdomains.push_back(s);
4913  if (write_complex_abs)
4914  complex_vars_active_subdomains.push_back(s);
4915  }
4916 
4917  return complex_vars_active_subdomains;
4918 }

◆ get_conversion() [1/2]

const ExodusII_IO_Helper::Conversion & libMesh::ExodusII_IO_Helper::get_conversion ( const ElemType  type) const
inherited

◆ get_conversion() [2/2]

const ExodusII_IO_Helper::Conversion & libMesh::ExodusII_IO_Helper::get_conversion ( std::string  type_str) const
inherited

Definition at line 556 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::element_equivalence_map, and libMesh::ExodusII_IO_Helper::get_conversion().

557 {
558  // Do only upper-case comparisons
559  std::transform(type_str.begin(), type_str.end(), type_str.begin(), ::toupper);
560  return get_conversion (libmesh_map_find(element_equivalence_map, type_str));
561 }
const ExodusII_IO_Helper::Conversion & get_conversion(const ElemType type) const
std::map< std::string, ElemType > element_equivalence_map
Defines equivalence classes of Exodus element types that map to libmesh ElemTypes.

◆ get_eb_info_global()

void libMesh::Nemesis_IO_Helper::get_eb_info_global ( )

Definition at line 242 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, global_elem_blk_cnts, global_elem_blk_ids, libMesh::index_range(), nemesis_err_flag, num_elem_blks_global, libMesh::out, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

243 {
246 
247  if (num_elem_blks_global > 0)
248  {
250  Nemesis::ne_get_eb_info_global(ex_id,
251  global_elem_blk_ids.data(),
252  global_elem_blk_cnts.data());
253  EX_CHECK_ERR(nemesis_err_flag, "Error reading global element block info!");
254  }
255 
256  if (verbose)
257  {
258  libMesh::out << "[" << this->processor_id() << "] " << "Global Element Block IDs and Counts:" << std::endl;
259  for (auto bn : index_range(global_elem_blk_ids))
260  {
261  libMesh::out << " [" << this->processor_id() << "] "
262  << "global_elem_blk_ids[" << bn << "]=" << global_elem_blk_ids[bn]
263  << ", global_elem_blk_cnts[" << bn << "]=" << global_elem_blk_cnts[bn]
264  << std::endl;
265  }
266  }
267 }
int nemesis_err_flag
Member data.
std::vector< int > global_elem_blk_ids
Read the global element block IDs and counts.
OStreamProxy out
processor_id_type processor_id() const
std::vector< int > global_elem_blk_cnts
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153

◆ get_elem_cmap()

void libMesh::Nemesis_IO_Helper::get_elem_cmap ( )

Definition at line 473 of file nemesis_io_helper.C.

References elem_cmap_elem_cnts, elem_cmap_elem_ids, elem_cmap_ids, elem_cmap_proc_ids, elem_cmap_side_ids, libMesh::ExodusII_IO_Helper::ex_id, libMesh::index_range(), nemesis_err_flag, num_elem_cmaps, libMesh::out, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

474 {
478 
479  for (auto i : index_range(elem_cmap_elem_ids))
480  {
484 
485  if (elem_cmap_elem_cnts[i] > 0)
486  {
488  Nemesis::ne_get_elem_cmap(ex_id,
489  elem_cmap_ids[i],
490  elem_cmap_elem_ids[i].data(),
491  elem_cmap_side_ids[i].data(),
492  elem_cmap_proc_ids[i].data(),
493  this->processor_id());
494  EX_CHECK_ERR(nemesis_err_flag, "Error reading elem cmap elem, side, and processor ids!");
495  }
496 
497  if (verbose)
498  {
499  libMesh::out << "[" << this->processor_id() << "] elem_cmap_elem_ids[" << i << "]=";
500  for (const auto & dof : elem_cmap_elem_ids[i])
501  libMesh::out << dof << " ";
502  libMesh::out << std::endl;
503 
504  // These must be the (local) side IDs (in the ExodusII face numbering scheme)
505  // of the sides shared across processors.
506  libMesh::out << "[" << this->processor_id() << "] elem_cmap_side_ids[" << i << "]=";
507  for (const auto & dof : elem_cmap_side_ids[i])
508  libMesh::out << dof << " ";
509  libMesh::out << std::endl;
510 
511  // This is basically a vector, all entries of which are = elem_cmap_ids[i]
512  // Not sure if it's always guaranteed to be that or what...
513  libMesh::out << "[" << this->processor_id() << "] elem_cmap_proc_ids[" << i << "]=";
514  for (const auto & dof : elem_cmap_proc_ids[i])
515  libMesh::out << dof << " ";
516  libMesh::out << std::endl;
517  }
518  }
519 }
int nemesis_err_flag
Member data.
std::vector< std::vector< int > > elem_cmap_side_ids
std::vector< std::vector< int > > elem_cmap_elem_ids
3 vectors of vectors for storing element communication IDs for this processor.
std::vector< std::vector< int > > elem_cmap_proc_ids
std::vector< int > elem_cmap_elem_cnts
int num_elem_cmaps
The number of elemental communication maps for this processor.
OStreamProxy out
std::vector< int > elem_cmap_ids
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153

◆ get_elem_map()

void libMesh::Nemesis_IO_Helper::get_elem_map ( )

Definition at line 320 of file nemesis_io_helper.C.

References elem_mapb, elem_mapi, libMesh::ExodusII_IO_Helper::ex_id, libMesh::make_range(), nemesis_err_flag, num_border_elems, num_internal_elems, libMesh::out, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

321 {
323  elem_mapb.resize(num_border_elems);
324 
326  Nemesis::ne_get_elem_map(ex_id,
327  elem_mapi.empty() ? nullptr : elem_mapi.data(),
328  elem_mapb.empty() ? nullptr : elem_mapb.data(),
329  this->processor_id()
330  );
331  EX_CHECK_ERR(nemesis_err_flag, "Error reading element maps!");
332 
333 
334  if (verbose)
335  {
336  libMesh::out << "[" << this->processor_id() << "] elem_mapi[i] = ";
337  for (auto i : make_range(num_internal_elems-1))
338  libMesh::out << elem_mapi[i] << ", ";
339  libMesh::out << "... " << elem_mapi.back() << std::endl;
340 
341  libMesh::out << "[" << this->processor_id() << "] elem_mapb[i] = ";
342  for (auto i : make_range(std::min(10, num_border_elems-1)))
343  libMesh::out << elem_mapb[i] << ", ";
344  libMesh::out << "... " << elem_mapb.back() << std::endl;
345  }
346 }
int nemesis_err_flag
Member data.
int num_internal_elems
The number of internal FEM elements.
OStreamProxy out
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176
std::vector< int > elem_mapb
Vector which stores border element IDs.
processor_id_type processor_id() const
std::vector< int > elem_mapi
Vector which stores internal element IDs.
int num_border_elems
The number of border FEM elements.

◆ get_elem_type()

const char * libMesh::ExodusII_IO_Helper::get_elem_type ( ) const
inherited
Returns
The current element type.
Note
The default behavior is for this value to be in all capital letters, e.g. HEX27.

Definition at line 563 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::elem_type.

564 {
565  return elem_type.data();
566 }

◆ get_elemset_data_indices()

void libMesh::ExodusII_IO_Helper::get_elemset_data_indices ( std::map< std::pair< dof_id_type, elemset_id_type >, unsigned int > &  elemset_array_indices)
inherited

Similar to read_elemset_data(), but instead of creating one std::map per elemset per variable, creates a single map of (elem_id, elemset_id) tuples, and stores the exo file array indexing for any/all elemset variables on that elemset (they are all the same).

Definition at line 4311 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::elemset_ids, libMesh::ExodusII_IO_Helper::elemset_list, libMesh::ExodusII_IO_Helper::num_elem_sets, and libMesh::ExodusII_IO_Helper::num_elems_per_set.

4312 {
4313  // Clear existing data, we are going to build these data structures from scratch
4314  elemset_array_indices.clear();
4315 
4316  // Read the elemset data.
4317  //
4318  // Note: we assume that the functions
4319  // 1.) this->read_elemset_info() and
4320  // 2.) this->read_elemset()
4321  // have already been called, so that we already know e.g. how
4322  // many elems are in each set, their ids, etc.
4323  int offset=0;
4324  for (int es=0; es<num_elem_sets; ++es)
4325  {
4326  offset += (es > 0 ? num_elems_per_set[es-1] : 0);
4327 
4328  // Note: we don't actually call exII::ex_get_var() here because
4329  // we don't need the values. We only need the indices into that vector
4330  // for each (elem_id, elemset_id) tuple.
4331  for (int i=0; i<num_elems_per_set[es]; ++i)
4332  {
4333  dof_id_type exodus_elem_id = elemset_list[i + offset];
4334 
4335  // FIXME: We should use exodus_elem_num_to_libmesh for this,
4336  // but it apparently is never set up, so just
4337  // subtract 1 from the Exodus elem id.
4338  dof_id_type converted_elem_id = exodus_elem_id - 1;
4339 
4340  // Make key based on the elem and set ids
4341  // Make a NodeBCTuple key from the converted information.
4342  auto key = std::make_pair(converted_elem_id,
4343  static_cast<elemset_id_type>(elemset_ids[es]));
4344 
4345  // Store the array index of this (node, b_id) tuple
4346  elemset_array_indices.emplace(key, cast_int<unsigned int>(i));
4347  } // end for (i)
4348  } // end for (es)
4349 }
std::vector< int > num_elems_per_set
uint8_t dof_id_type
Definition: id_types.h:67

◆ get_exodus_version()

int libMesh::ExodusII_IO_Helper::get_exodus_version ( )
staticinherited
Returns
The ExodusII API version, in "nodot" format; e.g. 822 for 8.22

Definition at line 321 of file exodusII_io_helper.C.

Referenced by libMesh::ExodusII_IO::get_exodus_version().

322 {
323  return EX_API_VERS_NODOT;
324 }

◆ get_init_global()

void libMesh::Nemesis_IO_Helper::get_init_global ( )

Fills: num_nodes_global, num_elems_global, num_elem_blks_global, num_node_sets_global, num_side_sets_global Call after: read_and_store_header_info() Call before: Any other get_* function from this class.

Definition at line 151 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, nemesis_err_flag, num_elem_blks_global, num_elems_global, num_node_sets_global, num_nodes_global, num_side_sets_global, libMesh::out, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

152 {
154  Nemesis::ne_get_init_global(ex_id,
160  EX_CHECK_ERR(nemesis_err_flag, "Error reading initial global data!");
161 
162  if (verbose)
163  {
164  libMesh::out << "[" << this->processor_id() << "] " << "num_nodes_global=" << num_nodes_global << std::endl;
165  libMesh::out << "[" << this->processor_id() << "] " << "num_elems_global=" << num_elems_global << std::endl;
166  libMesh::out << "[" << this->processor_id() << "] " << "num_elem_blks_global=" << num_elem_blks_global << std::endl;
167  libMesh::out << "[" << this->processor_id() << "] " << "num_node_sets_global=" << num_node_sets_global << std::endl;
168  libMesh::out << "[" << this->processor_id() << "] " << "num_side_sets_global=" << num_side_sets_global << std::endl;
169  }
170 }
int nemesis_err_flag
Member data.
int num_nodes_global
Global initial information.
OStreamProxy out
processor_id_type processor_id() const

◆ get_init_info()

void libMesh::Nemesis_IO_Helper::get_init_info ( )

Definition at line 271 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, ftype, nemesis_err_flag, num_proc, num_proc_in_file, libMesh::out, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

272 {
274  Nemesis::ne_get_init_info(ex_id,
275  &num_proc,
277  &ftype);
278  EX_CHECK_ERR(nemesis_err_flag, "Error reading initial info!");
279 
280  if (verbose)
281  {
282  libMesh::out << "[" << this->processor_id() << "] " << "num_proc=" << num_proc << std::endl;
283  libMesh::out << "[" << this->processor_id() << "] " << "num_proc_in_file=" << num_proc_in_file << std::endl;
284  libMesh::out << "[" << this->processor_id() << "] " << "ftype=" << ftype << std::endl;
285  }
286 }
char ftype
The type of file to be written.
int nemesis_err_flag
Member data.
int num_proc
The number of processors for which the NEMESIS I file was created.
OStreamProxy out
int num_proc_in_file
The number of processors for which the NEMESIS I file stores information.
processor_id_type processor_id() const

◆ get_libmesh_elem_id()

dof_id_type libMesh::ExodusII_IO_Helper::get_libmesh_elem_id ( int  exodus_elem_id)
inherited

Definition at line 2190 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::elem_num_map, and libMesh::ExodusII_IO_Helper::get_libmesh_id().

Referenced by libMesh::ExodusII_IO_Helper::read_elemental_var_values().

2191 {
2192  return this->get_libmesh_id(exodus_elem_id, this->elem_num_map);
2193 }
dof_id_type get_libmesh_id(int exodus_id, const std::vector< int > &num_map)
Internal implementation for the two sets of functions above.

◆ get_libmesh_node_id()

dof_id_type libMesh::ExodusII_IO_Helper::get_libmesh_node_id ( int  exodus_node_id)
inherited

Helper function that takes a (1-based) Exodus node/elem id and determines the corresponding libMesh Node/Elem id.

Takes into account whether the user has chosen to set the Node/Elem unique ids based on the {node,elem}_num_map or to let libMesh set them.

Definition at line 2185 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::get_libmesh_id(), and libMesh::ExodusII_IO_Helper::node_num_map.

Referenced by libMesh::ExodusII_IO_Helper::read_edge_blocks(), and libMesh::ExodusII_IO_Helper::read_nodal_var_values().

2186 {
2187  return this->get_libmesh_id(exodus_node_id, this->node_num_map);
2188 }
dof_id_type get_libmesh_id(int exodus_id, const std::vector< int > &num_map)
Internal implementation for the two sets of functions above.

◆ get_loadbal_param()

void libMesh::Nemesis_IO_Helper::get_loadbal_param ( )

Definition at line 290 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, nemesis_err_flag, num_border_elems, num_border_nodes, num_elem_cmaps, num_external_nodes, num_internal_elems, num_internal_nodes, num_node_cmaps, libMesh::out, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

291 {
293  Nemesis::ne_get_loadbal_param(ex_id,
301  this->processor_id() // The ID of the processor for which info is to be read
302  );
303  EX_CHECK_ERR(nemesis_err_flag, "Error reading load balance parameters!");
304 
305 
306  if (verbose)
307  {
308  libMesh::out << "[" << this->processor_id() << "] " << "num_internal_nodes=" << num_internal_nodes << std::endl;
309  libMesh::out << "[" << this->processor_id() << "] " << "num_border_nodes=" << num_border_nodes << std::endl;
310  libMesh::out << "[" << this->processor_id() << "] " << "num_external_nodes=" << num_external_nodes << std::endl;
311  libMesh::out << "[" << this->processor_id() << "] " << "num_internal_elems=" << num_internal_elems << std::endl;
312  libMesh::out << "[" << this->processor_id() << "] " << "num_border_elems=" << num_border_elems << std::endl;
313  libMesh::out << "[" << this->processor_id() << "] " << "num_node_cmaps=" << num_node_cmaps << std::endl;
314  libMesh::out << "[" << this->processor_id() << "] " << "num_elem_cmaps=" << num_elem_cmaps << std::endl;
315  }
316 }
int num_external_nodes
The number of FEM nodes that reside on another processor but whose element partially resides on the c...
int nemesis_err_flag
Member data.
int num_node_cmaps
The number of nodal communication maps for this processor.
int num_internal_elems
The number of internal FEM elements.
int num_elem_cmaps
The number of elemental communication maps for this processor.
OStreamProxy out
processor_id_type processor_id() const
int num_border_nodes
The number of FEM nodes local to a processor but residing in an element which also has FEM nodes on o...
int num_internal_nodes
To be used with the Nemesis::ne_get_loadbal_param() routine.
int num_border_elems
The number of border FEM elements.

◆ get_node_cmap()

void libMesh::Nemesis_IO_Helper::get_node_cmap ( )

Definition at line 431 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, libMesh::index_range(), nemesis_err_flag, node_cmap_ids, node_cmap_node_cnts, node_cmap_node_ids, node_cmap_proc_ids, num_node_cmaps, libMesh::out, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

432 {
435 
436  for (auto i : index_range(node_cmap_node_ids))
437  {
440 
441  // Don't call ne_get_node_cmap() if there is nothing there to
442  // get, Nemesis throws an error in this case.
443  if (node_cmap_node_cnts[i] > 0)
444  {
446  Nemesis::ne_get_node_cmap(ex_id,
447  node_cmap_ids[i],
448  node_cmap_node_ids[i].data(),
449  node_cmap_proc_ids[i].data(),
450  this->processor_id());
451  EX_CHECK_ERR(nemesis_err_flag, "Error reading node cmap node and processor ids!");
452  }
453 
454  if (verbose)
455  {
456  libMesh::out << "[" << this->processor_id() << "] node_cmap_node_ids[" << i << "]=";
457  for (const auto & dof : node_cmap_node_ids[i])
458  libMesh::out << dof << " ";
459  libMesh::out << std::endl;
460 
461  // This is basically a vector, all entries of which are = node_cmap_ids[i]
462  // Not sure if it's always guaranteed to be that or what...
463  libMesh::out << "[" << this->processor_id() << "] node_cmap_proc_ids[" << i << "]=";
464  for (const auto & dof : node_cmap_proc_ids[i])
465  libMesh::out << dof << " ";
466  libMesh::out << std::endl;
467  }
468  }
469 }
std::vector< int > node_cmap_ids
Vectors for storing the communication map parameters.
int nemesis_err_flag
Member data.
int num_node_cmaps
The number of nodal communication maps for this processor.
std::vector< std::vector< int > > node_cmap_proc_ids
OStreamProxy out
std::vector< int > node_cmap_node_cnts
std::vector< std::vector< int > > node_cmap_node_ids
2 vectors of vectors for storing the node communication IDs for this processor.
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153

◆ get_node_map()

void libMesh::Nemesis_IO_Helper::get_node_map ( )

Definition at line 351 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, nemesis_err_flag, node_mapb, node_mape, node_mapi, num_border_nodes, num_external_nodes, num_internal_nodes, libMesh::out, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

352 {
354  node_mapb.resize(num_border_nodes);
356 
358  Nemesis::ne_get_node_map(ex_id,
359  node_mapi.empty() ? nullptr : node_mapi.data(),
360  node_mapb.empty() ? nullptr : node_mapb.data(),
361  node_mape.empty() ? nullptr : node_mape.data(),
362  this->processor_id()
363  );
364  EX_CHECK_ERR(nemesis_err_flag, "Error reading node maps!");
365 
366  if (verbose)
367  {
368  // Remark: The Exodus/Nemesis node numbering is always (?) 1-based! This means the first interior node id will
369  // always be == 1.
370  libMesh::out << "[" << this->processor_id() << "] " << "first interior node id=" << node_mapi[0] << std::endl;
371  libMesh::out << "[" << this->processor_id() << "] " << "last interior node id=" << node_mapi.back() << std::endl;
372 
373  libMesh::out << "[" << this->processor_id() << "] " << "first boundary node id=" << node_mapb[0] << std::endl;
374  libMesh::out << "[" << this->processor_id() << "] " << "last boundary node id=" << node_mapb.back() << std::endl;
375 
376  // The number of external nodes is sometimes zero, don't try to access
377  // node_mape.back() in this case!
378  if (num_external_nodes > 0)
379  {
380  libMesh::out << "[" << this->processor_id() << "] " << "first external node id=" << node_mape[0] << std::endl;
381  libMesh::out << "[" << this->processor_id() << "] " << "last external node id=" << node_mape.back() << std::endl;
382  }
383  }
384 }
int num_external_nodes
The number of FEM nodes that reside on another processor but whose element partially resides on the c...
int nemesis_err_flag
Member data.
std::vector< int > node_mape
Vector which stores external node IDs.
std::vector< int > node_mapi
Vector which stores internal node IDs.
OStreamProxy out
std::vector< int > node_mapb
Vector which stores border node IDs.
processor_id_type processor_id() const
int num_border_nodes
The number of FEM nodes local to a processor but residing in an element which also has FEM nodes on o...
int num_internal_nodes
To be used with the Nemesis::ne_get_loadbal_param() routine.

◆ get_node_set_id()

int libMesh::ExodusII_IO_Helper::get_node_set_id ( int  index)
inherited

Get the node set id for the given node set index.

Definition at line 1157 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::nodeset_ids.

1158 {
1159  libmesh_assert_less (index, nodeset_ids.size());
1160 
1161  return nodeset_ids[index];
1162 }

◆ get_node_set_name()

std::string libMesh::ExodusII_IO_Helper::get_node_set_name ( int  index)
inherited

Get the node set name for the given node set index if supplied in the mesh file.

Otherwise an empty string is returned.

Definition at line 1166 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::id_to_ns_names, and libMesh::ExodusII_IO_Helper::nodeset_ids.

1167 {
1168  libmesh_assert_less (index, nodeset_ids.size());
1169 
1170  return id_to_ns_names[nodeset_ids[index]];
1171 }
std::map< int, std::string > id_to_ns_names

◆ get_nodeset_data_indices()

void libMesh::ExodusII_IO_Helper::get_nodeset_data_indices ( std::map< BoundaryInfo::NodeBCTuple, unsigned int > &  bc_array_indices)
inherited

Similar to read_nodeset_data(), but instead of creating one std::map per nodeset per variable, creates a single map of (node_id, boundary_id) tuples, and stores the exo file array indexing for any/all nodeset variables on that nodeset (they are all the same).

Definition at line 4453 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::node_sets_node_list, libMesh::ExodusII_IO_Helper::nodeset_ids, libMesh::ExodusII_IO_Helper::num_node_sets, and libMesh::ExodusII_IO_Helper::num_nodes_per_set.

4454 {
4455  // Clear existing data, we are going to build these data structures from scratch
4456  bc_array_indices.clear();
4457 
4458  // Read the nodeset data.
4459  //
4460  // Note: we assume that the functions
4461  // 1.) this->read_nodeset_info() and
4462  // 2.) this->read_all_nodesets()
4463  // have already been called, so that we already know e.g. how
4464  // many nodes are in each set, their ids, etc.
4465  int offset=0;
4466  for (int ns=0; ns<num_node_sets; ++ns)
4467  {
4468  offset += (ns > 0 ? num_nodes_per_set[ns-1] : 0);
4469  // Note: we don't actually call exII::ex_get_var() here because
4470  // we don't need the values. We only need the indices into that vector
4471  // for each (node_id, boundary_id) tuple.
4472  for (int i=0; i<num_nodes_per_set[ns]; ++i)
4473  {
4474  // The read_all_nodesets() function now reads all the node ids into the
4475  // node_sets_node_list vector, which is of length "total_nodes_in_all_sets"
4476  // The old read_nodset() function is no longer called as far as I can tell,
4477  // and should probably be removed? The "offset" that we are using only
4478  // depends on the current nodeset index and the num_nodes_per_set vector,
4479  // which gets filled in by the call to read_all_nodesets().
4480  dof_id_type exodus_node_id = node_sets_node_list[i + offset];
4481 
4482  // FIXME: We should use exodus_node_num_to_libmesh for this,
4483  // but it apparently is never set up, so just
4484  // subtract 1 from the Exodus node id.
4485  dof_id_type converted_node_id = exodus_node_id - 1;
4486 
4487  // Make a NodeBCTuple key from the converted information.
4488  BoundaryInfo::NodeBCTuple key = std::make_tuple
4489  (converted_node_id, nodeset_ids[ns]);
4490 
4491  // Store the array index of this (node, b_id) tuple
4492  bc_array_indices.emplace(key, cast_int<unsigned int>(i));
4493  } // end for (i)
4494  } // end for (ns)
4495 }
std::tuple< dof_id_type, boundary_id_type > NodeBCTuple
Create a list of (node_id, boundary_id) tuples for all relevant nodes.
std::vector< int > node_sets_node_list
std::vector< int > num_nodes_per_set
uint8_t dof_id_type
Definition: id_types.h:67

◆ get_ns_param_global()

void libMesh::Nemesis_IO_Helper::get_ns_param_global ( )

Definition at line 210 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, global_nodeset_ids, libMesh::index_range(), nemesis_err_flag, num_global_node_counts, num_global_node_df_counts, num_node_sets_global, libMesh::out, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

211 {
212  if (num_node_sets_global > 0)
213  {
217 
219  Nemesis::ne_get_ns_param_global(ex_id,
220  global_nodeset_ids.data(),
221  num_global_node_counts.data(),
223  EX_CHECK_ERR(nemesis_err_flag, "Error reading global nodeset parameters!");
224 
225  if (verbose)
226  {
227  libMesh::out << "[" << this->processor_id() << "] " << "Global Nodeset IDs, Node Counts, and DF counts:" << std::endl;
228  for (auto bn : index_range(global_nodeset_ids))
229  {
230  libMesh::out << " [" << this->processor_id() << "] "
231  << "global_nodeset_ids["<<bn<<"]=" << global_nodeset_ids[bn]
232  << ", num_global_node_counts["<<bn<<"]=" << num_global_node_counts[bn]
233  << ", num_global_node_df_counts["<<bn<<"]=" << num_global_node_df_counts[bn]
234  << std::endl;
235  }
236  }
237  }
238 }
std::vector< int > num_global_node_counts
std::vector< int > global_nodeset_ids
Containers for reading global nodeset information.
int nemesis_err_flag
Member data.
std::vector< int > num_global_node_df_counts
OStreamProxy out
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153

◆ get_side_set_id()

int libMesh::ExodusII_IO_Helper::get_side_set_id ( int  index)
inherited

Get the side set id for the given side set index.

Definition at line 1139 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::ss_ids.

1140 {
1141  libmesh_assert_less (index, ss_ids.size());
1142 
1143  return ss_ids[index];
1144 }

◆ get_side_set_name()

std::string libMesh::ExodusII_IO_Helper::get_side_set_name ( int  index)
inherited

Get the side set name for the given side set index if supplied in the mesh file.

Otherwise an empty string is returned.

Definition at line 1148 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::id_to_ss_names, and libMesh::ExodusII_IO_Helper::ss_ids.

1149 {
1150  libmesh_assert_less (index, ss_ids.size());
1151 
1152  return id_to_ss_names[ss_ids[index]];
1153 }
std::map< int, std::string > id_to_ss_names

◆ get_sideset_data_indices()

void libMesh::ExodusII_IO_Helper::get_sideset_data_indices ( const MeshBase mesh,
std::map< BoundaryInfo::BCTuple, unsigned int > &  bc_array_indices 
)
inherited

Similar to read_sideset_data(), but instead of creating one std::map per sideset per variable, creates a single map of (elem, side, boundary_id) tuples, and stores the exo file array indexing for any/all sideset variables on that sideset (they are all the same).

This function does not actually call exII::ex_get_sset_var() to get values, and can be useful if only the original ordering of (elem, side) pairs in the exo file is required in cases where a separate approach is used to read the sideset data arrays.

Definition at line 3926 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::elem_list, libMesh::MeshBase::elem_ptr(), libMesh::ExodusII_IO_Helper::get_conversion(), libMesh::ExodusII_IO_Helper::Conversion::get_side_map(), mesh, libMesh::ExodusII_IO_Helper::num_side_sets, libMesh::ExodusII_IO_Helper::num_sides_per_set, libMesh::ExodusII_IO_Helper::side_list, libMesh::ExodusII_IO_Helper::ss_ids, and libMesh::Elem::type().

3928 {
3929  // Clear any existing data, we are going to build this data structure from scratch
3930  bc_array_indices.clear();
3931 
3932  // Store the sideset data array indices.
3933  //
3934  // Note: we assume that read_sideset() has already been called
3935  // for each sideset, so the required values in elem_list and
3936  // side_list are already present.
3937  int offset=0;
3938  for (int ss=0; ss<num_side_sets; ++ss)
3939  {
3940  offset += (ss > 0 ? num_sides_per_set[ss-1] : 0);
3941  for (int i=0; i<num_sides_per_set[ss]; ++i)
3942  {
3943  dof_id_type exodus_elem_id = elem_list[i + offset];
3944  unsigned int exodus_side_id = side_list[i + offset];
3945 
3946  // FIXME: We should use exodus_elem_num_to_libmesh for this,
3947  // but it apparently is never set up, so just
3948  // subtract 1 from the Exodus elem id.
3949  dof_id_type converted_elem_id = exodus_elem_id - 1;
3950 
3951  // Conversion operator for this Elem type
3952  const auto & conv = get_conversion(mesh.elem_ptr(converted_elem_id)->type());
3953 
3954  // Map from Exodus side id to libmesh side id.
3955  // Note: the mapping is defined on 0-based indices, so subtract
3956  // 1 before doing the mapping.
3957  unsigned int converted_side_id = conv.get_side_map(exodus_side_id - 1);
3958 
3959  // Make a BCTuple key from the converted information.
3960  BoundaryInfo::BCTuple key = std::make_tuple
3961  (converted_elem_id,
3962  converted_side_id,
3963  ss_ids[ss]);
3964 
3965  // Store (elem, side, b_id) tuple with corresponding array index
3966  bc_array_indices.emplace(key, cast_int<unsigned int>(i));
3967  } // end for (i)
3968  } // end for (ss)
3969 }
std::tuple< dof_id_type, unsigned short int, boundary_id_type > BCTuple
Create a list of (element_id, side_id, boundary_id) tuples for relevant sides.
std::vector< int > num_sides_per_set
MeshBase & mesh
const ExodusII_IO_Helper::Conversion & get_conversion(const ElemType type) const
virtual const Elem * elem_ptr(const dof_id_type i) const =0
virtual ElemType type() const =0
uint8_t dof_id_type
Definition: id_types.h:67

◆ get_ss_param_global()

void libMesh::Nemesis_IO_Helper::get_ss_param_global ( )

Fills: global_sideset_ids, num_global_side_counts, num_global_side_df_counts Call after: get_init_global()

Definition at line 174 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, global_sideset_ids, libMesh::index_range(), nemesis_err_flag, num_global_side_counts, num_global_side_df_counts, num_side_sets_global, libMesh::out, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

175 {
176  if (num_side_sets_global > 0)
177  {
180 
181  // df = "distribution factor", not really sure what that is. I don't yet have a file
182  // which has distribution factors so I guess we'll worry about it later...
184 
186  Nemesis::ne_get_ss_param_global(ex_id,
187  global_sideset_ids.data(),
188  num_global_side_counts.data(),
190  EX_CHECK_ERR(nemesis_err_flag, "Error reading global sideset parameters!");
191 
192  if (verbose)
193  {
194  libMesh::out << "[" << this->processor_id() << "] " << "Global Sideset IDs, Side Counts, and DF counts:" << std::endl;
195  for (auto bn : index_range(global_sideset_ids))
196  {
197  libMesh::out << " [" << this->processor_id() << "] "
198  << "global_sideset_ids["<<bn<<"]=" << global_sideset_ids[bn]
199  << ", num_global_side_counts["<<bn<<"]=" << num_global_side_counts[bn]
200  << ", num_global_side_df_counts["<<bn<<"]=" << num_global_side_df_counts[bn]
201  << std::endl;
202  }
203  }
204  }
205 }
std::vector< int > global_sideset_ids
Containers for reading global sideset (boundary conditions) information.
int nemesis_err_flag
Member data.
std::vector< int > num_global_side_df_counts
std::vector< int > num_global_side_counts
OStreamProxy out
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153

◆ initialize()

void libMesh::Nemesis_IO_Helper::initialize ( std::string  title,
const MeshBase mesh,
bool  use_discontinuous = false 
)
overridevirtual

Specialization of the initialize function from ExodusII_IO_Helper that also writes global initial data to file.

Reimplemented from libMesh::ExodusII_IO_Helper.

Definition at line 754 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::_use_mesh_dimension_instead_of_spatial_dimension, libMesh::ExodusII_IO_Helper::_write_as_dimension, build_element_and_node_maps(), compute_border_node_ids(), compute_communication_map_parameters(), compute_elem_communication_maps(), compute_element_maps(), compute_internal_and_border_elems_and_internal_nodes(), compute_node_communication_maps(), compute_node_maps(), compute_num_global_elem_blocks(), compute_num_global_nodesets(), compute_num_global_sidesets(), elem_cmap_elem_cnts, elem_cmap_elem_ids, elem_cmap_ids, elem_cmap_proc_ids, elem_cmap_side_ids, elem_mapb, elem_mapi, global_elem_blk_cnts, global_elem_blk_ids, global_nodeset_ids, global_sideset_ids, mesh, libMesh::ParallelObject::n_processors(), node_cmap_ids, node_cmap_node_cnts, node_cmap_node_ids, node_cmap_proc_ids, node_mapb, node_mape, node_mapi, num_border_elems, num_border_nodes, libMesh::ExodusII_IO_Helper::num_dim, num_elem_blks_global, num_elem_cmaps, num_external_nodes, num_global_node_counts, num_global_node_df_counts, num_global_side_counts, num_global_side_df_counts, num_internal_elems, num_internal_nodes, num_node_cmaps, num_node_sets_global, num_side_sets_global, libMesh::MeshBase::parallel_n_elem(), libMesh::MeshBase::parallel_n_nodes(), put_cmap_params(), put_eb_info_global(), put_elem_cmap(), put_elem_map(), put_init_global(), put_init_info(), put_loadbal_param(), put_node_cmap(), put_node_map(), put_ns_param_global(), put_ss_param_global(), and write_exodus_initialization_info().

755 {
756  // Make sure that the reference passed in is really a DistributedMesh
757  // const DistributedMesh & pmesh = cast_ref<const DistributedMesh &>(mesh);
758  const MeshBase & pmesh = mesh;
759 
760  // If _write_as_dimension is nonzero, use it to set num_dim later in the Exodus file.
764  num_dim = mesh.mesh_dimension();
765  else
766  num_dim = mesh.spatial_dimension();
767 
768  // According to Nemesis documentation, first call when writing should be to
769  // ne_put_init_info(). Our reader doesn't actually call this, but we should
770  // strive to be as close to a normal nemesis file as possible...
771  this->put_init_info(this->n_processors(), 1, "p");
772 
773 
774  // Gather global "initial" information for Nemesis. This consists of
775  // three parts labeled I, II, and III below...
776 
777  //
778  // I.) Need to compute the number of global element blocks. To be consistent with
779  // Exodus, we also incorrectly associate the number of element blocks with the
780  // number of libmesh subdomains...
781  //
782  this->compute_num_global_elem_blocks(pmesh);
783 
784  //
785  // II.) Determine the global number of nodesets by communication.
786  // This code relies on BoundaryInfo storing side and node
787  // boundary IDs separately at the time they are added to the
788  // BoundaryInfo object.
789  //
790  this->compute_num_global_nodesets(pmesh);
791 
792  //
793  // III.) Need to compute the global number of sidesets by communication:
794  // This code relies on BoundaryInfo storing side and node
795  // boundary IDs separately at the time they are added to the
796  // BoundaryInfo object.
797  //
798  this->compute_num_global_sidesets(pmesh);
799 
800  // Now write the global data obtained in steps I, II, and III to the Nemesis file
801  this->put_init_global(pmesh.parallel_n_nodes(),
802  pmesh.parallel_n_elem(),
803  this->num_elem_blks_global, /* I. */
804  this->num_node_sets_global, /* II. */
805  this->num_side_sets_global /* III. */
806  );
807 
808  // Next, we'll write global element block information to the file. This was already
809  // gathered in step I. above
811  this->global_elem_blk_cnts);
812 
813 
814  // Next, write global nodeset information to the file. This was already gathered in
815  // step II. above.
816  this->num_global_node_df_counts.clear();
817  this->num_global_node_df_counts.resize(this->global_nodeset_ids.size()); // distribution factors all zero...
821 
822 
823  // Next, write global sideset information to the file. This was already gathered in
824  // step III. above.
825  this->num_global_side_df_counts.clear();
826  this->num_global_side_df_counts.resize(this->global_sideset_ids.size()); // distribution factors all zero...
830 
831 
832  // Before we go any further we need to derive consistent node and
833  // element numbering schemes for all local elems and nodes connected
834  // to local elements.
835  //
836  // Must be called *after* the local_subdomain_counts map has been constructed
837  // by the compute_num_global_elem_blocks() function!
838  this->build_element_and_node_maps(pmesh);
839 
840  // Next step is to write "load balance" parameters. Several things need to
841  // be computed first though...
842 
843  // First we'll collect IDs of border nodes.
844  this->compute_border_node_ids(pmesh);
845 
846  // Next we'll collect numbers of internal and border elements, and internal nodes.
847  // Note: "A border node does not a border element make...", that is, just because one
848  // of an element's nodes has been identified as a border node, the element is not
849  // necessarily a border element. It must have a side on the boundary between processors,
850  // i.e. have a face neighbor with a different processor id...
852 
853  // Finally we are ready to write the loadbal information to the file
855  this->num_border_nodes,
856  this->num_external_nodes,
857  this->num_internal_elems,
858  this->num_border_elems,
859  this->num_node_cmaps,
860  this->num_elem_cmaps);
861 
862 
863  // Now we need to compute the "communication map" parameters. These are basically
864  // lists of nodes and elements which need to be communicated between different processors
865  // when the mesh file is read back in.
867 
868  // Write communication map parameters to file.
869  this->put_cmap_params(this->node_cmap_ids,
870  this->node_cmap_node_cnts,
871  this->elem_cmap_ids,
872  this->elem_cmap_elem_cnts);
873 
874  // Ready the node communication maps. The node IDs which
875  // are communicated are the ones currently stored in
876  // proc_nodes_touched_intersections.
878 
879  // Write the packed node communication vectors to file.
880  this->put_node_cmap(this->node_cmap_node_ids,
881  this->node_cmap_proc_ids);
882 
883  // Ready the node maps. These have nothing to do with communication, they map
884  // the nodes to internal, border, and external nodes in the file.
885  this->compute_node_maps();
886 
887  // Call the Nemesis API to write the node maps to file.
888  this->put_node_map(this->node_mapi,
889  this->node_mapb,
890  this->node_mape);
891 
892  // Ready the element communication maps. This includes border
893  // element IDs, sides which are on the border, and the processors to which
894  // they are to be communicated...
896 
897  // Call the Nemesis API to write the packed element communication maps vectors to file
898  this->put_elem_cmap(this->elem_cmap_elem_ids,
899  this->elem_cmap_side_ids,
900  this->elem_cmap_proc_ids);
901 
902  // Ready the Nemesis element maps (internal and border) for writing to file.
903  this->compute_element_maps();
904 
905  // Call the Nemesis API to write the internal and border element IDs.
906  this->put_elem_map(this->elem_mapi,
907  this->elem_mapb);
908 
909  // Now write Exodus-specific initialization information, some of which is
910  // different when you are using Nemesis.
911  this->write_exodus_initialization_info(pmesh, title_in);
912 } // end initialize()
std::vector< int > num_global_node_counts
void compute_element_maps()
This function computes element maps (really just packs vectors) which map the elements to internal an...
std::vector< int > global_nodeset_ids
Containers for reading global nodeset information.
std::vector< int > global_sideset_ids
Containers for reading global sideset (boundary conditions) information.
void compute_num_global_nodesets(const MeshBase &pmesh)
This function uses global communication routines to determine the number of nodesets across the entir...
std::vector< int > node_cmap_ids
Vectors for storing the communication map parameters.
int num_external_nodes
The number of FEM nodes that reside on another processor but whose element partially resides on the c...
std::vector< int > node_mape
Vector which stores external node IDs.
void compute_elem_communication_maps()
This function computes element communication maps (really just packs vectors) in preparation for writ...
void compute_num_global_elem_blocks(const MeshBase &pmesh)
This function uses global communication routines to determine the number of element blocks across the...
MeshBase & mesh
int num_node_cmaps
The number of nodal communication maps for this processor.
void put_elem_map(std::vector< int > &elem_mapi, std::vector< int > &elem_mapb)
Outputs IDs of internal and border elements.
std::vector< int > num_global_node_df_counts
std::vector< std::vector< int > > elem_cmap_side_ids
std::vector< std::vector< int > > node_cmap_proc_ids
void put_ns_param_global(std::vector< int > &global_nodeset_ids, std::vector< int > &num_global_node_counts, std::vector< int > &num_global_node_df_counts)
This function writes information about global node sets.
void put_eb_info_global(std::vector< int > &global_elem_blk_ids, std::vector< int > &global_elem_blk_cnts)
Writes global block information to the file .) global_elem_blk_ids - list of block IDs for all blocks...
void compute_border_node_ids(const MeshBase &pmesh)
This function constructs the set of border node IDs present on the current mesh.
void compute_communication_map_parameters()
This function determines the communication map parameters which will eventually be written to file...
void compute_node_communication_maps()
Compute the node communication maps (really just pack vectors) in preparation for writing them to fil...
std::vector< int > num_global_side_df_counts
void build_element_and_node_maps(const MeshBase &pmesh)
This function builds the libmesh -> exodus and exodus -> libmesh node and element maps...
void put_init_global(dof_id_type num_nodes_global, dof_id_type num_elems_global, unsigned num_elem_blks_global, unsigned num_node_sets_global, unsigned num_side_sets_global)
Writes global information including: .) global number of nodes .) global number of elems ...
processor_id_type n_processors() const
std::vector< int > num_global_side_counts
std::vector< int > global_elem_blk_ids
Read the global element block IDs and counts.
std::vector< std::vector< int > > elem_cmap_elem_ids
3 vectors of vectors for storing element communication IDs for this processor.
std::vector< int > node_mapi
Vector which stores internal node IDs.
std::vector< std::vector< int > > elem_cmap_proc_ids
void put_cmap_params(std::vector< int > &node_cmap_ids, std::vector< int > &node_cmap_node_cnts, std::vector< int > &elem_cmap_ids, std::vector< int > &elem_cmap_elem_cnts)
Outputs initial information for communication maps.
void compute_num_global_sidesets(const MeshBase &pmesh)
This function uses global communication routines to determine the number of sidesets across the entir...
int num_internal_elems
The number of internal FEM elements.
void compute_internal_and_border_elems_and_internal_nodes(const MeshBase &pmesh)
This function constructs the set of border and internal element IDs and internal node IDs present on ...
void compute_node_maps()
Compute the node maps (really just pack vectors) which map the nodes to internal, border...
void put_elem_cmap(std::vector< std::vector< int >> &elem_cmap_elem_ids, std::vector< std::vector< int >> &elem_cmap_side_ids, std::vector< std::vector< int >> &elem_cmap_proc_ids)
Writes information about elemental communication map.
void put_node_map(std::vector< int > &node_mapi, std::vector< int > &node_mapb, std::vector< int > &node_mape)
Outputs IDs of internal, border, and external nodes.
std::vector< int > elem_cmap_elem_cnts
int num_elem_cmaps
The number of elemental communication maps for this processor.
std::vector< int > elem_cmap_ids
void put_ss_param_global(std::vector< int > &global_sideset_ids, std::vector< int > &num_global_side_counts, std::vector< int > &num_global_side_df_counts)
This function writes information about global side sets.
std::vector< int > node_cmap_node_cnts
void write_exodus_initialization_info(const MeshBase &pmesh, const std::string &title)
This function writes exodus-specific initialization information.
void put_init_info(unsigned num_proc, unsigned num_proc_in_file, const char *ftype)
Writing functions.
void put_node_cmap(std::vector< std::vector< int >> &node_cmap_node_ids, std::vector< std::vector< int >> &node_cmap_proc_ids)
Outputs all of the nodal communication maps for this processor.
std::vector< int > elem_mapb
Vector which stores border element IDs.
std::vector< int > node_mapb
Vector which stores border node IDs.
std::vector< std::vector< int > > node_cmap_node_ids
2 vectors of vectors for storing the node communication IDs for this processor.
std::vector< int > global_elem_blk_cnts
void put_loadbal_param(unsigned num_internal_nodes, unsigned num_border_nodes, unsigned num_external_nodes, unsigned num_internal_elems, unsigned num_border_elems, unsigned num_node_cmaps, unsigned num_elem_cmaps)
Writes load balance parameters, some of which are described below: .) num_internal_nodes - nodes "who...
std::vector< int > elem_mapi
Vector which stores internal element IDs.
int num_border_nodes
The number of FEM nodes local to a processor but residing in an element which also has FEM nodes on o...
int num_internal_nodes
To be used with the Nemesis::ne_get_loadbal_param() routine.
int num_border_elems
The number of border FEM elements.

◆ initialize_element_variables()

void libMesh::Nemesis_IO_Helper::initialize_element_variables ( std::vector< std::string >  names,
const std::vector< std::set< subdomain_id_type >> &  vars_active_subdomains 
)
overridevirtual

Override the Exodus Helper's implementation of this function so that it works correctly in parallel.

Reimplemented from libMesh::ExodusII_IO_Helper.

Definition at line 2582 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::_elem_vars_initialized, libMesh::ExodusII_IO_Helper::check_existing_vars(), libMesh::ExodusII_IO_Helper::elem_var_names, libMesh::ExodusII_IO_Helper::ELEMENTAL, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, global_elem_blk_ids, libMesh::index_range(), libMesh::ExodusII_IO_Helper::num_elem_vars, and libMesh::ExodusII_IO_Helper::write_var_names().

2584 {
2585  // Quick return if there are no element variables to write
2586  if (names.size() == 0)
2587  return;
2588 
2589  // Quick return if we have already called this function
2591  return;
2592 
2593  // Be sure that variables in the file match what we are asking for
2594  if (num_elem_vars > 0)
2595  {
2596  this->check_existing_vars(ELEMENTAL, names, this->elem_var_names);
2597  return;
2598  }
2599 
2600  // Set the flag so we can skip this stuff on subsequent calls to
2601  // initialize_element_variables()
2602  _elem_vars_initialized = true;
2603 
2604  this->write_var_names(ELEMENTAL, names);
2605 
2606  // Create a truth table from global_elem_blk_ids and the information
2607  // in vars_active_subdomains. Create a truth table of
2608  // size global_elem_blk_ids.size() * names.size().
2609  std::vector<int> truth_tab(global_elem_blk_ids.size() * names.size());
2610  for (auto blk : index_range(global_elem_blk_ids))
2611  for (auto var : index_range(names))
2612  if (vars_active_subdomains[var].empty() ||
2613  vars_active_subdomains[var].count(cast_int<subdomain_id_type>(global_elem_blk_ids[blk])))
2614  truth_tab[names.size() * blk + var] = 1;
2615 
2616  // Write truth table to file.
2617  if (truth_tab.size())
2618  {
2619  ex_err = exII::ex_put_elem_var_tab(ex_id,
2620  cast_int<int>(global_elem_blk_ids.size()),
2621  cast_int<int>(names.size()),
2622  truth_tab.data());
2623  EX_CHECK_ERR(ex_err, "Error writing element truth table.");
2624  }
2625 }
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().
std::vector< std::string > elem_var_names
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 ...
std::vector< int > global_elem_blk_ids
Read the global element block IDs and counts.
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153

◆ initialize_global_variables()

void libMesh::ExodusII_IO_Helper::initialize_global_variables ( std::vector< std::string >  names)
inherited

Sets up the global variables.

Definition at line 3496 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_global_vars_initialized, libMesh::ExodusII_IO_Helper::_run_only_on_proc0, libMesh::ExodusII_IO_Helper::check_existing_vars(), libMesh::ExodusII_IO_Helper::GLOBAL, libMesh::ExodusII_IO_Helper::global_var_names, libMesh::ExodusII_IO_Helper::num_global_vars, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::write_var_names().

3497 {
3498  if ((_run_only_on_proc0) && (this->processor_id() != 0))
3499  return;
3500 
3501  // Quick return if there are no global variables to write
3502  if (names.size() == 0)
3503  return;
3504 
3506  return;
3507 
3508  // Be sure that variables in the file match what we are asking for
3509  if (num_global_vars > 0)
3510  {
3511  this->check_existing_vars(GLOBAL, names, this->global_var_names);
3512  return;
3513  }
3514 
3515  _global_vars_initialized = true;
3516 
3517  this->write_var_names(GLOBAL, names);
3518 }
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().
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 ...
std::vector< std::string > global_var_names
processor_id_type processor_id() const

◆ initialize_nodal_variables()

void libMesh::ExodusII_IO_Helper::initialize_nodal_variables ( std::vector< std::string >  names)
inherited

Sets up the nodal variables.

Definition at line 3468 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_nodal_vars_initialized, libMesh::ExodusII_IO_Helper::_run_only_on_proc0, libMesh::ExodusII_IO_Helper::check_existing_vars(), libMesh::ExodusII_IO_Helper::NODAL, libMesh::ExodusII_IO_Helper::nodal_var_names, libMesh::ExodusII_IO_Helper::num_nodal_vars, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::write_var_names().

3469 {
3470  if ((_run_only_on_proc0) && (this->processor_id() != 0))
3471  return;
3472 
3473  // Quick return if there are no nodal variables to write
3474  if (names.size() == 0)
3475  return;
3476 
3477  // Quick return if we have already called this function
3479  return;
3480 
3481  // Be sure that variables in the file match what we are asking for
3482  if (num_nodal_vars > 0)
3483  {
3484  this->check_existing_vars(NODAL, names, this->nodal_var_names);
3485  return;
3486  }
3487 
3488  // Set the flag so we can skip the rest of this function on subsequent calls.
3489  _nodal_vars_initialized = true;
3490 
3491  this->write_var_names(NODAL, names);
3492 }
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().
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 ...
std::vector< std::string > nodal_var_names
processor_id_type processor_id() const

◆ message() [1/2]

void libMesh::ExodusII_IO_Helper::message ( std::string_view  msg)
inherited

◆ message() [2/2]

void libMesh::ExodusII_IO_Helper::message ( std::string_view  msg,
int  i 
)
inherited

Prints the message defined in msg, and appends the number i to the end of the message.

Useful for printing messages in loops. Can be turned off if verbosity is set to 0.

Definition at line 577 of file exodusII_io_helper.C.

References libMesh::out, and libMesh::ExodusII_IO_Helper::verbose.

578 {
579  if (verbose) libMesh::out << msg << i << "." << std::endl;
580 }
OStreamProxy out

◆ n_processors()

processor_id_type libMesh::ParallelObject::n_processors ( ) const
inlineinherited
Returns
The number of processors in the group.

Definition at line 103 of file parallel_object.h.

References libMesh::ParallelObject::_communicator, libMesh::libmesh_assert(), and TIMPI::Communicator::size().

Referenced by libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::DofMap::add_constraints_to_send_list(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::DofMap::add_neighbors_to_send_list(), libMesh::DistributedMesh::add_node(), libMesh::System::add_vector(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::FEMSystem::assembly(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::Partitioner::assign_partitioning(), libMesh::AztecLinearSolver< T >::AztecLinearSolver(), libMesh::Partitioner::build_graph(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::DistributedMesh::clear(), libMesh::DistributedMesh::clear_elems(), compute_border_node_ids(), construct_nemesis_filename(), libMesh::UnstructuredMesh::copy_nodes_and_elements(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::UnstructuredMesh::create_pid_mesh(), libMesh::MeshTools::create_processor_bounding_box(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::distribute_scalar_dofs(), libMesh::DistributedMesh::DistributedMesh(), libMesh::EnsightIO::EnsightIO(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::MeshBase::get_info(), libMesh::StaticCondensation::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_petscdm(), initialize(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::DistributedMesh::insert_elem(), libMesh::NumericVector< Number >::is_effectively_ghosted(), libMesh::NumericVector< Number >::is_effectively_serial(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_boundary_ids(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::DofMap::local_variable_indices(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::MeshBase::n_active_elem_on_proc(), libMesh::DofMap::n_dofs_per_processor(), libMesh::MeshBase::n_elem_on_proc(), libMesh::MeshBase::n_nodes_on_proc(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::Partitioner::partition(), libMesh::MeshBase::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::DofMap::prepare_send_list(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::NameBasedIO::read(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::CheckpointIO::read_connectivity(), libMesh::XdrIO::read_header(), libMesh::CheckpointIO::read_nodes(), libMesh::System::read_parallel_data(), libMesh::System::read_SCALAR_dofs(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::System::read_serialized_vector(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::Partitioner::repartition(), OverlappingFunctorTest::run_partitioner_test(), libMesh::DofMap::scatter_constraints(), libMesh::DistributedMesh::set_next_unique_id(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), WriteVecAndScalar::setupTests(), libMesh::RBEIMEvaluation::side_gather_bfs(), DistributedMeshTest::testRemoteElemError(), CheckpointIOTest::testSplitter(), libMesh::MeshRefinement::uniformly_coarsen(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::GMVIO::write_binary(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::VTKIO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::System::write_parallel_data(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), and libMesh::XdrIO::write_serialized_nodesets().

104  {
105  processor_id_type returnval =
106  cast_int<processor_id_type>(_communicator.size());
107  libmesh_assert(returnval); // We never have an empty comm
108  return returnval;
109  }
const Parallel::Communicator & _communicator
processor_id_type size() const
uint8_t processor_id_type
libmesh_assert(ctx)

◆ node_id_to_vec_id()

dof_id_type libMesh::ExodusII_IO_Helper::node_id_to_vec_id ( dof_id_type  n) const
inlineinherited

Definition at line 945 of file exodusII_io_helper.h.

References libMesh::ExodusII_IO_Helper::_added_side_node_offsets, libMesh::ExodusII_IO_Helper::_true_node_offsets, and libMesh::libmesh_assert().

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  }
uint8_t processor_id_type
libmesh_assert(ctx)
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...
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...

◆ open()

void libMesh::ExodusII_IO_Helper::open ( const char *  filename,
bool  read_only 
)
inherited

Opens an ExodusII mesh file named filename.

If read_only==true, the file will be opened with the EX_READ flag, otherwise it will be opened with the EX_WRITE flag.

Definition at line 669 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_max_name_length, libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::current_filename, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::opened_for_reading, libMesh::ExodusII_IO_Helper::opened_for_writing, libMesh::out, libMesh::Real, and libMesh::ExodusII_IO_Helper::verbose.

670 {
671  // Version of Exodus you are using
672  float ex_version = 0.;
673 
674  int comp_ws = 0;
675 
676  if (_single_precision)
677  comp_ws = cast_int<int>(sizeof(float));
678 
679  // Fall back on double precision when necessary since ExodusII
680  // doesn't seem to support long double
681  else
682  comp_ws = cast_int<int>(std::min(sizeof(Real), sizeof(double)));
683 
684  // Word size in bytes of the floating point data as they are stored
685  // in the ExodusII file. "If this argument is 0, the word size of the
686  // floating point data already stored in the file is returned"
687  int io_ws = 0;
688 
689  {
690  FPEDisabler disable_fpes;
691  ex_id = exII::ex_open(filename,
692  read_only ? EX_READ : EX_WRITE,
693  &comp_ws,
694  &io_ws,
695  &ex_version);
696  }
697 
698  std::string err_msg = std::string("Error opening ExodusII mesh file: ") + std::string(filename);
699  EX_CHECK_ERR(ex_id, err_msg);
700  if (verbose) libMesh::out << "File opened successfully." << std::endl;
701 
702  // If we're writing then we'll want to use the specified length;
703  // if we're reading then we'll override this by what's in the file.
704  int max_name_length_to_set = _max_name_length;
705 
706  if (read_only)
707  {
708  opened_for_reading = true;
709 
710  // ExodusII reads truncate to 32-char strings by default; we'd
711  // like to support whatever's in the file, so as early as possible
712  // let's find out what that is.
713  int max_name_length = exII::ex_inquire_int(ex_id, exII::EX_INQ_DB_MAX_USED_NAME_LENGTH);
714 
715  libmesh_error_msg_if(max_name_length > MAX_LINE_LENGTH,
716  "Unexpected maximum name length of " <<
717  max_name_length << " in file " << filename <<
718  " exceeds expected " << MAX_LINE_LENGTH);
719 
720  // I don't think the 32 here should be necessary, but let's make
721  // sure we don't accidentally make things *worse* for anyone.
722  max_name_length_to_set = std::max(max_name_length, 32);
723  }
724  else
725  opened_for_writing = true;
726 
727  ex_err = exII::ex_set_max_name_length(ex_id, max_name_length_to_set);
728  EX_CHECK_ERR(ex_err, "Error setting max ExodusII name length.");
729 
730  current_filename = std::string(filename);
731 }
The FPEDisabler class puts Floating-Point Exception (FPE) trapping on hold during its lifetime...
Definition: fpe_disabler.h:49
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
OStreamProxy out

◆ print_header()

void libMesh::ExodusII_IO_Helper::print_header ( )
inherited

Prints the ExodusII mesh file header, which includes the mesh title, the number of nodes, number of elements, mesh dimension, number of sidesets, and number of nodesets.

Definition at line 861 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::num_dim, libMesh::ExodusII_IO_Helper::num_elem, libMesh::ExodusII_IO_Helper::num_elem_blk, libMesh::ExodusII_IO_Helper::num_elem_sets, libMesh::ExodusII_IO_Helper::num_node_sets, libMesh::ExodusII_IO_Helper::num_nodes, libMesh::ExodusII_IO_Helper::num_side_sets, libMesh::out, libMesh::ExodusII_IO_Helper::title, and libMesh::ExodusII_IO_Helper::verbose.

862 {
863  if (verbose)
864  libMesh::out << "Title: \t" << title.data() << std::endl
865  << "Mesh Dimension: \t" << num_dim << std::endl
866  << "Number of Nodes: \t" << num_nodes << std::endl
867  << "Number of elements: \t" << num_elem << std::endl
868  << "Number of elt blocks: \t" << num_elem_blk << std::endl
869  << "Number of node sets: \t" << num_node_sets << std::endl
870  << "Number of side sets: \t" << num_side_sets << std::endl
871  << "Number of elem sets: \t" << num_elem_sets << std::endl;
872 }
std::vector< char > & title
OStreamProxy out

◆ print_nodes()

void libMesh::ExodusII_IO_Helper::print_nodes ( std::ostream &  out_stream = libMesh::out)
inherited

Prints the nodal information, by default to libMesh::out.

Definition at line 1063 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::num_nodes, libMesh::ExodusII_IO_Helper::x, libMesh::ExodusII_IO_Helper::y, and libMesh::ExodusII_IO_Helper::z.

1064 {
1065  for (int i=0; i<num_nodes; i++)
1066  out_stream << "(" << x[i] << ", " << y[i] << ", " << z[i] << ")" << std::endl;
1067 }

◆ processor_id()

processor_id_type libMesh::ParallelObject::processor_id ( ) const
inlineinherited
Returns
The rank of this processor in the group.

Definition at line 114 of file parallel_object.h.

References libMesh::ParallelObject::_communicator, and TIMPI::Communicator::rank().

Referenced by libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::BoundaryInfo::add_elements(), libMesh::DofMap::add_neighbors_to_send_list(), libMesh::DistributedMesh::add_node(), libMesh::MeshTools::Modification::all_tri(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::FEMSystem::assembly(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::Partitioner::assign_partitioning(), build_element_and_node_maps(), libMesh::Partitioner::build_graph(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::MeshFunction::check_found_elem(), libMesh::DistributedMesh::clear(), libMesh::DistributedMesh::clear_elems(), libMesh::ExodusII_IO_Helper::close(), compute_border_node_ids(), compute_communication_map_parameters(), compute_internal_and_border_elems_and_internal_nodes(), libMesh::RBConstruction::compute_max_error_bound(), compute_node_communication_maps(), compute_num_global_elem_blocks(), compute_num_global_nodesets(), compute_num_global_sidesets(), construct_nemesis_filename(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::ExodusII_IO_Helper::create(), libMesh::DistributedMesh::delete_elem(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::distribute_scalar_dofs(), libMesh::DistributedMesh::DistributedMesh(), libMesh::DofMapBase::end_dof(), libMesh::DofMapBase::end_old_dof(), libMesh::EnsightIO::EnsightIO(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::DofMapBase::first_dof(), libMesh::DofMapBase::first_old_dof(), libMesh::RBEIMEvaluation::gather_bfs(), get_cmap_params(), get_eb_info_global(), get_elem_cmap(), get_elem_map(), libMesh::MeshBase::get_info(), libMesh::DofMap::get_info(), get_init_global(), get_init_info(), libMesh::RBEIMEvaluation::get_interior_basis_functions_as_vecs(), get_loadbal_param(), libMesh::DofMap::get_local_constraints(), libMesh::MeshBase::get_local_constraints(), get_node_cmap(), get_node_map(), get_ns_param_global(), get_ss_param_global(), libMesh::SparsityPattern::Build::handle_vi_vj(), libMesh::LaplaceMeshSmoother::init(), libMesh::SystemSubsetBySubdomain::init(), HeatSystem::init_data(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::ExodusII_IO_Helper::initialize_element_variables(), libMesh::ExodusII_IO_Helper::initialize_global_variables(), libMesh::ExodusII_IO_Helper::initialize_nodal_variables(), libMesh::DistributedMesh::insert_elem(), libMesh::DofMap::is_evaluable(), libMesh::SparsityPattern::Build::join(), libMesh::TransientRBEvaluation::legacy_write_offline_data_to_files(), libMesh::RBSCMEvaluation::legacy_write_offline_data_to_files(), libMesh::RBEvaluation::legacy_write_offline_data_to_files(), libMesh::MeshTools::libmesh_assert_consistent_distributed(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_object_ids(), libMesh::DofMap::local_variable_indices(), main(), libMesh::MeshRefinement::make_coarsening_compatible(), AugmentSparsityOnInterface::mesh_reinit(), libMesh::TriangulatorInterface::MeshedHole::MeshedHole(), libMesh::MeshBase::n_active_local_elem(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::MeshTools::n_connected_components(), libMesh::MeshBase::n_constraint_rows(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::DofMapBase::n_local_dofs(), libMesh::MeshBase::n_local_elem(), libMesh::MeshBase::n_local_nodes(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::DistributedMesh::own_node(), libMesh::BoundaryInfo::parallel_sync_node_ids(), libMesh::BoundaryInfo::parallel_sync_side_ids(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::DofMap::process_mesh_constraint_rows(), put_cmap_params(), put_elem_cmap(), put_elem_map(), put_loadbal_param(), put_node_cmap(), put_node_map(), libMesh::NameBasedIO::read(), libMesh::Nemesis_IO::read(), libMesh::XdrIO::read(), libMesh::CheckpointIO::read(), libMesh::EquationSystems::read(), libMesh::ExodusII_IO_Helper::read_elem_num_map(), libMesh::ExodusII_IO_Helper::read_global_values(), libMesh::ExodusII_IO::read_header(), libMesh::CheckpointIO::read_header(), libMesh::XdrIO::read_header(), libMesh::System::read_header(), libMesh::DynaIO::read_mesh(), libMesh::ExodusII_IO_Helper::read_node_num_map(), libMesh::System::read_parallel_data(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs_helper(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::System::read_serialized_data(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), libMesh::System::read_serialized_vectors(), read_var_names_impl(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::StaticCondensationDofMap::reinit(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DistributedMesh::renumber_nodes_and_elements(), libMesh::DofMap::scatter_constraints(), libMesh::CheckpointIO::select_split_config(), libMesh::DistributedMesh::set_next_unique_id(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::RBEIMEvaluation::side_gather_bfs(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), ExodusTest< elem_type >::test_read_gold(), ExodusTest< elem_type >::test_write(), MeshInputTest::testAbaqusRead(), MeshInputTest::testBadGmsh(), BoundaryInfoTest::testBoundaryIDs(), MeshInputTest::testCopyElementSolutionImpl(), MeshInputTest::testCopyElementVectorImpl(), MeshInputTest::testCopyNodalSolutionImpl(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), MeshInputTest::testDynaFileMappings(), MeshInputTest::testDynaNoSplines(), MeshInputTest::testDynaReadElem(), MeshInputTest::testDynaReadPatch(), MeshInputTest::testExodusFileMappings(), MeshInputTest::testExodusIGASidesets(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), MeshInputTest::testGmshBCIDOverlap(), MeshInputTest::testGoodGmsh(), MeshInputTest::testGoodSTL(), MeshInputTest::testGoodSTLBinary(), BoundaryInfoTest::testInternalBoundary(), MeshInputTest::testLowOrderEdgeBlocks(), SystemsTest::testProjectMatrix3D(), BoundaryInfoTest::testShellFaceConstraints(), MeshInputTest::testSingleElementImpl(), WriteVecAndScalar::testSolution(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::NetGenMeshInterface::triangulate(), libMesh::MeshRefinement::uniformly_coarsen(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::DTKAdapter::update_variable_values(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::NameBasedIO::write(), libMesh::XdrIO::write(), libMesh::CheckpointIO::write(), libMesh::EquationSystems::write(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO::write_element_data(), libMesh::ExodusII_IO_Helper::write_element_values(), libMesh::ExodusII_IO_Helper::write_element_values_element_major(), libMesh::ExodusII_IO_Helper::write_elements(), libMesh::ExodusII_IO_Helper::write_elemset_data(), libMesh::ExodusII_IO_Helper::write_elemsets(), libMesh::ExodusII_IO::write_global_data(), libMesh::ExodusII_IO_Helper::write_global_values(), libMesh::System::write_header(), libMesh::ExodusII_IO::write_information_records(), libMesh::ExodusII_IO_Helper::write_information_records(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::UCDIO::write_nodal_data(), libMesh::VTKIO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data_common(), libMesh::ExodusII_IO::write_nodal_data_discontinuous(), libMesh::ExodusII_IO_Helper::write_nodal_values(), libMesh::ExodusII_IO_Helper::write_nodeset_data(), write_nodesets(), libMesh::ExodusII_IO_Helper::write_nodesets(), libMesh::RBEIMEvaluation::write_out_interior_basis_functions(), libMesh::RBEIMEvaluation::write_out_node_basis_functions(), libMesh::RBEIMEvaluation::write_out_side_basis_functions(), write_output_solvedata(), libMesh::System::write_parallel_data(), libMesh::RBConstruction::write_riesz_representors_to_files(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bc_names(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::System::write_serialized_data(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::XdrIO::write_serialized_subdomain_names(), libMesh::System::write_serialized_vector(), libMesh::System::write_serialized_vectors(), libMesh::ExodusII_IO_Helper::write_sideset_data(), write_sidesets(), libMesh::ExodusII_IO_Helper::write_sidesets(), libMesh::ExodusII_IO::write_timestep(), libMesh::ExodusII_IO_Helper::write_timestep(), and libMesh::ExodusII_IO::write_timestep_discontinuous().

115  { return cast_int<processor_id_type>(_communicator.rank()); }
processor_id_type rank() const
const Parallel::Communicator & _communicator

◆ put_cmap_params()

void libMesh::Nemesis_IO_Helper::put_cmap_params ( std::vector< int > &  node_cmap_ids,
std::vector< int > &  node_cmap_node_cnts,
std::vector< int > &  elem_cmap_ids,
std::vector< int > &  elem_cmap_elem_cnts 
)

Outputs initial information for communication maps.

Note
The order of the arguments specified in the Nemesis User's Manual is wrong. The correct order is (ids, counts, ids, counts). Must be called after put_loadbal_param().

Definition at line 639 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, nemesis_err_flag, and libMesh::ParallelObject::processor_id().

Referenced by initialize().

643 {
645  Nemesis::ne_put_cmap_params(ex_id,
646  node_cmap_ids_in.empty() ? nullptr : node_cmap_ids_in.data(),
647  node_cmap_node_cnts_in.empty() ? nullptr : node_cmap_node_cnts_in.data(),
648  elem_cmap_ids_in.empty() ? nullptr : elem_cmap_ids_in.data(),
649  elem_cmap_elem_cnts_in.empty() ? nullptr : elem_cmap_elem_cnts_in.data(),
650  this->processor_id());
651 
652  EX_CHECK_ERR(nemesis_err_flag, "Error writing cmap parameters!");
653 }
int nemesis_err_flag
Member data.
processor_id_type processor_id() const

◆ put_eb_info_global()

void libMesh::Nemesis_IO_Helper::put_eb_info_global ( std::vector< int > &  global_elem_blk_ids,
std::vector< int > &  global_elem_blk_cnts 
)

Writes global block information to the file .) global_elem_blk_ids - list of block IDs for all blocks present in the mesh .) global_elem_blk_cnts - number of elements in each block for the global mesh.

Must be called after put_init_global().

Definition at line 559 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, and nemesis_err_flag.

Referenced by initialize().

561 {
563  Nemesis::ne_put_eb_info_global(ex_id,
564  global_elem_blk_ids_in.data(),
565  global_elem_blk_cnts_in.data());
566 
567  EX_CHECK_ERR(nemesis_err_flag, "Error writing global element block information!");
568 }
int nemesis_err_flag
Member data.

◆ put_elem_cmap()

void libMesh::Nemesis_IO_Helper::put_elem_cmap ( std::vector< std::vector< int >> &  elem_cmap_elem_ids,
std::vector< std::vector< int >> &  elem_cmap_side_ids,
std::vector< std::vector< int >> &  elem_cmap_proc_ids 
)

Writes information about elemental communication map.

Note
This class contains elem_cmap_elem_ids, elem_cmap_side_ids, abd elem_cmap_proc_ids which can be used when calling this function.

Must be called after put_cmap_params().

Definition at line 719 of file nemesis_io_helper.C.

References elem_cmap_ids, libMesh::ExodusII_IO_Helper::ex_id, libMesh::index_range(), nemesis_err_flag, and libMesh::ParallelObject::processor_id().

Referenced by initialize().

722 {
723  for (auto i : index_range(elem_cmap_ids))
724  {
726  Nemesis::ne_put_elem_cmap(ex_id,
727  this->elem_cmap_ids[i],
728  elem_cmap_elem_ids_in[i].data(),
729  elem_cmap_side_ids_in[i].data(),
730  elem_cmap_proc_ids_in[i].data(),
731  this->processor_id());
732 
733  EX_CHECK_ERR(nemesis_err_flag, "Error writing elem communication map to file!");
734  }
735 }
int nemesis_err_flag
Member data.
std::vector< int > elem_cmap_ids
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153

◆ put_elem_map()

void libMesh::Nemesis_IO_Helper::put_elem_map ( std::vector< int > &  elem_mapi,
std::vector< int > &  elem_mapb 
)

Outputs IDs of internal and border elements.

Must be called after ne_put_loadbal_param().

Definition at line 740 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, nemesis_err_flag, and libMesh::ParallelObject::processor_id().

Referenced by initialize().

742 {
744  Nemesis::ne_put_elem_map(ex_id,
745  elem_mapi_in.empty() ? nullptr : elem_mapi_in.data(),
746  elem_mapb_in.empty() ? nullptr : elem_mapb_in.data(),
747  this->processor_id());
748 
749  EX_CHECK_ERR(nemesis_err_flag, "Error writing Nemesis internal and border element maps to file!");
750 }
int nemesis_err_flag
Member data.
processor_id_type processor_id() const

◆ put_init_global()

void libMesh::Nemesis_IO_Helper::put_init_global ( dof_id_type  num_nodes_global,
dof_id_type  num_elems_global,
unsigned  num_elem_blks_global,
unsigned  num_node_sets_global,
unsigned  num_side_sets_global 
)

Writes global information including: .) global number of nodes .) global number of elems .) global number of element blocks .) global number of node sets .) global number of side sets.

Definition at line 540 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, and nemesis_err_flag.

Referenced by initialize().

545 {
547  Nemesis::ne_put_init_global(ex_id,
548  num_nodes_global_in,
549  num_elems_global_in,
550  num_elem_blks_global_in,
551  num_node_sets_global_in,
552  num_side_sets_global_in);
553 
554  EX_CHECK_ERR(nemesis_err_flag, "Error writing initial global data!");
555 }
int nemesis_err_flag
Member data.

◆ put_init_info()

void libMesh::Nemesis_IO_Helper::put_init_info ( unsigned  num_proc,
unsigned  num_proc_in_file,
const char *  ftype 
)

Writing functions.

Writes basic info about the partitioning to file .) num_proc - number of processors .) num_proc_in_file - number of processors in the current file - generally equal to 1 .) ftype = "s" for scalar load-balance file, "p" for parallel file

Definition at line 524 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, and nemesis_err_flag.

Referenced by initialize().

527 {
529  Nemesis::ne_put_init_info(ex_id,
530  num_proc_in,
531  num_proc_in_file_in,
532  const_cast<char *>(ftype_in));
533 
534  EX_CHECK_ERR(nemesis_err_flag, "Error writing initial information!");
535 }
int nemesis_err_flag
Member data.

◆ put_loadbal_param()

void libMesh::Nemesis_IO_Helper::put_loadbal_param ( unsigned  num_internal_nodes,
unsigned  num_border_nodes,
unsigned  num_external_nodes,
unsigned  num_internal_elems,
unsigned  num_border_elems,
unsigned  num_node_cmaps,
unsigned  num_elem_cmaps 
)

Writes load balance parameters, some of which are described below: .) num_internal_nodes - nodes "wholly" owned by the current processor .) num_border_nodes - nodes local to a processor but residing in an element which also has nodes on other processors .) num_external_nodes - nodes that reside on other processors but whose element "partially" resides on the current processor – we assert this should be zero on reading! .) num_border_elems - elements local to this processor but whose nodes reside on other processors as well.

.) processor - ID of the processor for which information is to be written

Definition at line 613 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, nemesis_err_flag, and libMesh::ParallelObject::processor_id().

Referenced by initialize().

620 {
622  Nemesis::ne_put_loadbal_param(ex_id,
623  num_internal_nodes_in,
624  num_border_nodes_in,
625  num_external_nodes_in,
626  num_internal_elems_in,
627  num_border_elems_in,
628  num_node_cmaps_in,
629  num_elem_cmaps_in,
630  this->processor_id());
631 
632  EX_CHECK_ERR(nemesis_err_flag, "Error writing loadbal parameters!");
633 }
int nemesis_err_flag
Member data.
processor_id_type processor_id() const

◆ put_node_cmap()

void libMesh::Nemesis_IO_Helper::put_node_cmap ( std::vector< std::vector< int >> &  node_cmap_node_ids,
std::vector< std::vector< int >> &  node_cmap_proc_ids 
)

Outputs all of the nodal communication maps for this processor.

Internally, this function loops over all communication maps and calls Nemesis::ne_put_node_cmap() for each one.

.) node_cmap_node_ids = Nodal IDs of the FEM nodes in this communication map .) node_cmap_proc_ids = processor IDs associated with each of the nodes in node_ids

In the Nemesis file, these all appear to be written to the same chunks of data: n_comm_nids and n_comm_proc, but don't rely on these names...

Note
This class contains node_cmap_node_ids and node_cmap_proc_ids which can be used when calling this function.

Must be called after put_cmap_params().

Definition at line 658 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, libMesh::index_range(), nemesis_err_flag, node_cmap_ids, libMesh::out, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

Referenced by initialize().

660 {
661  // Print to screen what we are about to print to Nemesis file
662  if (verbose)
663  {
664  for (auto i : index_range(node_cmap_node_ids_in))
665  {
666  libMesh::out << "[" << this->processor_id() << "] put_node_cmap() : nodes communicated to proc "
667  << this->node_cmap_ids[i]
668  << " = ";
669  for (const auto & node_id : node_cmap_node_ids_in[i])
670  libMesh::out << node_id << " ";
671  libMesh::out << std::endl;
672  }
673 
674  for (auto i : index_range(node_cmap_node_ids_in))
675  {
676  libMesh::out << "[" << this->processor_id() << "] put_node_cmap() : processor IDs = ";
677  for (const auto & proc_id : node_cmap_proc_ids_in[i])
678  libMesh::out << proc_id << " ";
679  libMesh::out << std::endl;
680  }
681  }
682 
683  for (auto i : index_range(node_cmap_node_ids_in))
684  {
685  int * node_ids_ptr = node_cmap_node_ids_in[i].empty() ?
686  nullptr : node_cmap_node_ids_in[i].data();
687  int * proc_ids_ptr = node_cmap_proc_ids_in[i].empty() ?
688  nullptr : node_cmap_proc_ids_in[i].data();
689 
691  Nemesis::ne_put_node_cmap(ex_id, this->node_cmap_ids[i],
692  node_ids_ptr, proc_ids_ptr,
693  this->processor_id());
694 
695  EX_CHECK_ERR(nemesis_err_flag, "Error writing node communication map to file!");
696  }
697 }
std::vector< int > node_cmap_ids
Vectors for storing the communication map parameters.
int nemesis_err_flag
Member data.
OStreamProxy out
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153

◆ put_node_map()

void libMesh::Nemesis_IO_Helper::put_node_map ( std::vector< int > &  node_mapi,
std::vector< int > &  node_mapb,
std::vector< int > &  node_mape 
)

Outputs IDs of internal, border, and external nodes.

LibMesh asserts that the number of external nodes is zero in the Nemesis files it reads

Definition at line 702 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, nemesis_err_flag, and libMesh::ParallelObject::processor_id().

Referenced by initialize().

705 {
707  Nemesis::ne_put_node_map(ex_id,
708  node_mapi_in.empty() ? nullptr : node_mapi_in.data(),
709  node_mapb_in.empty() ? nullptr : node_mapb_in.data(),
710  node_mape_in.empty() ? nullptr : node_mape_in.data(),
711  this->processor_id());
712 
713  EX_CHECK_ERR(nemesis_err_flag, "Error writing Nemesis internal and border node maps to file!");
714 }
int nemesis_err_flag
Member data.
processor_id_type processor_id() const

◆ put_ns_param_global()

void libMesh::Nemesis_IO_Helper::put_ns_param_global ( std::vector< int > &  global_nodeset_ids,
std::vector< int > &  num_global_node_counts,
std::vector< int > &  num_global_node_df_counts 
)

This function writes information about global node sets.

.) global_nodeset_ids - vector of global node set IDs .) num_global_node_counts - vector of global node counts contained in each global node set .) num_global_df_count - vector of global distribution factors in each global node set

Must be called after put_init_global()

Definition at line 573 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, global_nodeset_ids, and nemesis_err_flag.

Referenced by initialize().

576 {
577  // Only add nodesets if there are some
578  if (global_nodeset_ids.size())
579  {
581  Nemesis::ne_put_ns_param_global(ex_id,
582  global_nodeset_ids_in.data(),
583  num_global_node_counts_in.data(),
584  num_global_node_df_counts_in.data());
585  }
586 
587  EX_CHECK_ERR(nemesis_err_flag, "Error writing global nodeset parameters!");
588 }
std::vector< int > global_nodeset_ids
Containers for reading global nodeset information.
int nemesis_err_flag
Member data.

◆ put_ss_param_global()

void libMesh::Nemesis_IO_Helper::put_ss_param_global ( std::vector< int > &  global_sideset_ids,
std::vector< int > &  num_global_side_counts,
std::vector< int > &  num_global_side_df_counts 
)

This function writes information about global side sets.

.) global_sideset_ids - vector of global side set IDs .) num_global_side_counts - vector of global side counts contained in each global side set .) num_global_df_count - vector of global distribution factors in each global side set

Must be called after put_init_global()

Definition at line 593 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, global_sideset_ids, and nemesis_err_flag.

Referenced by initialize().

596 {
597  // Only add sidesets if there are some
598  if (global_sideset_ids.size())
599  {
601  Nemesis::ne_put_ss_param_global(ex_id,
602  global_sideset_ids_in.data(),
603  num_global_side_counts_in.data(),
604  num_global_side_df_counts_in.data());
605  }
606 
607  EX_CHECK_ERR(nemesis_err_flag, "Error writing global sideset parameters!");
608 }
std::vector< int > global_sideset_ids
Containers for reading global sideset (boundary conditions) information.
int nemesis_err_flag
Member data.

◆ read_all_nodesets()

void libMesh::ExodusII_IO_Helper::read_all_nodesets ( )
inherited

New API that reads all nodesets simultaneously.

This may be slightly faster than reading them one at a time. Calls ex_get_concat_node_sets() under the hood.

Definition at line 1737 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::MappedInputVector::data(), libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::id_to_ns_names, libMesh::ExodusII_IO_Helper::node_sets_dist_fact, libMesh::ExodusII_IO_Helper::node_sets_dist_index, libMesh::ExodusII_IO_Helper::node_sets_node_index, libMesh::ExodusII_IO_Helper::node_sets_node_list, libMesh::ExodusII_IO_Helper::nodeset_ids, libMesh::ExodusII_IO_Helper::num_node_df_per_set, libMesh::ExodusII_IO_Helper::num_node_sets, and libMesh::ExodusII_IO_Helper::num_nodes_per_set.

Referenced by libMesh::ExodusII_IO_Helper::write_nodeset_data().

1738 {
1739  LOG_SCOPE("read_all_nodesets()", "ExodusII_IO_Helper");
1740 
1741  // Figure out how many nodesets there are in the file so we can
1742  // properly resize storage as necessary.
1743  num_node_sets =
1744  inquire
1745  (*this, exII::EX_INQ_NODE_SETS,
1746  "Error retrieving number of node sets");
1747 
1748  // Figure out how many nodes there are in all the nodesets.
1749  int total_nodes_in_all_sets =
1750  inquire
1751  (*this, exII::EX_INQ_NS_NODE_LEN,
1752  "Error retrieving number of nodes in all node sets.");
1753 
1754  // Figure out how many distribution factors there are in all the nodesets.
1755  int total_df_in_all_sets =
1756  inquire
1757  (*this, exII::EX_INQ_NS_DF_LEN,
1758  "Error retrieving number of distribution factors in all node sets.");
1759 
1760  // If there are no nodesets, there's nothing to read in.
1761  if (num_node_sets == 0)
1762  return;
1763 
1764  // Allocate space to read all the nodeset data.
1765  // Use existing class members where possible to avoid shadowing
1766  nodeset_ids.clear(); nodeset_ids.resize(num_node_sets);
1771  node_sets_node_list.clear(); node_sets_node_list.resize(total_nodes_in_all_sets);
1772  node_sets_dist_fact.clear(); node_sets_dist_fact.resize(total_df_in_all_sets);
1773 
1774  // Handle single-precision files
1775  MappedInputVector mapped_node_sets_dist_fact(node_sets_dist_fact, _single_precision);
1776 
1777  // Build exII::ex_set_spec struct
1778  exII::ex_set_specs set_specs = {};
1779  set_specs.sets_ids = nodeset_ids.data();
1780  set_specs.num_entries_per_set = num_nodes_per_set.data();
1781  set_specs.num_dist_per_set = num_node_df_per_set.data();
1782  set_specs.sets_entry_index = node_sets_node_index.data();
1783  set_specs.sets_dist_index = node_sets_dist_index.data();
1784  set_specs.sets_entry_list = node_sets_node_list.data();
1785  set_specs.sets_extra_list = nullptr;
1786  set_specs.sets_dist_fact = total_df_in_all_sets ? mapped_node_sets_dist_fact.data() : nullptr;
1787 
1788  ex_err = exII::ex_get_concat_sets(ex_id, exII::EX_NODE_SET, &set_specs);
1789  EX_CHECK_ERR(ex_err, "Error reading concatenated nodesets");
1790 
1791  // Read the nodeset names from file!
1792  char name_buffer[libmesh_max_str_length+1];
1793  for (int i=0; i<num_node_sets; ++i)
1794  {
1795  ex_err = exII::ex_get_name
1796  (ex_id,
1797  exII::EX_NODE_SET,
1798  nodeset_ids[i],
1799  name_buffer);
1800  EX_CHECK_ERR(ex_err, "Error getting node set name.");
1801  id_to_ns_names[nodeset_ids[i]] = name_buffer;
1802  }
1803 }
std::vector< int > node_sets_node_index
std::vector< int > num_node_df_per_set
std::vector< int > node_sets_node_list
std::map< int, std::string > id_to_ns_names
std::vector< int > num_nodes_per_set
std::vector< Real > node_sets_dist_fact
std::vector< int > node_sets_dist_index

◆ read_and_store_header_info()

void libMesh::ExodusII_IO_Helper::read_and_store_header_info ( )
inherited

Reads an ExodusII mesh file header, and stores required information on this object.

Definition at line 766 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::header_info, libMesh::ExodusII_IO_Helper::message(), libMesh::ExodusII_IO_Helper::num_elem_vars, libMesh::ExodusII_IO_Helper::num_elemset_vars, libMesh::ExodusII_IO_Helper::num_global_vars, libMesh::ExodusII_IO_Helper::num_nodal_vars, libMesh::ExodusII_IO_Helper::num_nodeset_vars, libMesh::ExodusII_IO_Helper::num_sideset_vars, libMesh::ExodusII_IO_Helper::read_header(), and libMesh::ExodusII_IO_Helper::read_num_time_steps().

767 {
768  // Read header params from file, storing them in this class's
769  // ExodusHeaderInfo struct. This automatically updates the local
770  // num_dim, num_elem, etc. references.
771  this->header_info = this->read_header();
772 
773  // Read the number of timesteps which are present in the file
774  this->read_num_time_steps();
775 
776  ex_err = exII::ex_get_variable_param(ex_id, exII::EX_NODAL, &num_nodal_vars);
777  EX_CHECK_ERR(ex_err, "Error reading number of nodal variables.");
778 
779  ex_err = exII::ex_get_variable_param(ex_id, exII::EX_ELEM_BLOCK, &num_elem_vars);
780  EX_CHECK_ERR(ex_err, "Error reading number of elemental variables.");
781 
782  ex_err = exII::ex_get_variable_param(ex_id, exII::EX_GLOBAL, &num_global_vars);
783  EX_CHECK_ERR(ex_err, "Error reading number of global variables.");
784 
785  ex_err = exII::ex_get_variable_param(ex_id, exII::EX_SIDE_SET, &num_sideset_vars);
786  EX_CHECK_ERR(ex_err, "Error reading number of sideset variables.");
787 
788  ex_err = exII::ex_get_variable_param(ex_id, exII::EX_NODE_SET, &num_nodeset_vars);
789  EX_CHECK_ERR(ex_err, "Error reading number of nodeset variables.");
790 
791  ex_err = exII::ex_get_variable_param(ex_id, exII::EX_ELEM_SET, &num_elemset_vars);
792  EX_CHECK_ERR(ex_err, "Error reading number of elemset variables.");
793 
794  message("Exodus header info retrieved successfully.");
795 }
ExodusHeaderInfo read_header() const
Reads an ExodusII mesh file header, leaving this object&#39;s internal data structures unchanged...
void message(std::string_view msg)
Prints the message defined in msg.
void read_num_time_steps()
Reads the number of timesteps currently stored in the Exodus file and stores it in the num_time_steps...

◆ read_bex_cv_blocks()

void libMesh::ExodusII_IO_Helper::read_bex_cv_blocks ( )
inherited

Reads the optional bex_cv_blocks from the ExodusII mesh file.

Definition at line 951 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::bex_dense_constraint_vecs, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::libmesh_assert(), libMesh::make_range(), and libMesh::MeshTools::Subdivision::next.

952 {
953  // If a bex blob exists, we look for Bezier Extraction coefficient
954  // data there.
955 
956  // These APIs require newer Exodus than 5.22
957 #if EX_API_VERS_NODOT >= 800
958  int n_blobs = exII::ex_inquire_int(ex_id, exII::EX_INQ_BLOB);
959 
960  if (n_blobs > 0)
961  {
962  std::vector<exII::ex_blob> blobs(n_blobs);
963  std::vector<std::vector<char>> blob_names(n_blobs);
964  for (auto i : make_range(n_blobs))
965  {
966  blob_names[i].resize(libmesh_max_str_length+1);
967  blobs[i].name = blob_names[i].data();
968  }
969 
970  ex_err = exII::ex_get_blobs(ex_id, blobs.data());
971  EX_CHECK_ERR(ex_err, "Error getting blobs.");
972 
973  bool found_blob = false;
974  const exII::ex_blob * my_blob = &blobs[0];
975  for (const auto & blob : blobs)
976  {
977  if (std::string("bex_cv_blob") == blob.name)
978  {
979  found_blob = true;
980  my_blob = &blob;
981  }
982  }
983 
984  if (!found_blob)
985  libmesh_error_msg("Found no bex_cv_blob for bezier elements");
986 
987  const int n_blob_attr =
988  exII::ex_get_attribute_count(ex_id, exII::EX_BLOB,
989  my_blob->id);
990 
991  std::vector<exII::ex_attribute> attributes(n_blob_attr);
992  ex_err = exII::ex_get_attribute_param(ex_id, exII::EX_BLOB,
993  my_blob->id,
994  attributes.data());
995  EX_CHECK_ERR(ex_err, "Error getting bex blob attribute parameters.");
996 
997  int bex_num_dense_cv_blocks = 0;
998  std::vector<int> bex_dense_cv_info;
999  for (auto & attr : attributes)
1000  {
1001  if (std::string("bex_dense_cv_info") == attr.name)
1002  {
1003  const std::size_t value_count = attr.value_count;
1004  if (value_count % 2)
1005  libmesh_error_msg("Found odd number of bex_dense_cv_info");
1006 
1007  bex_dense_cv_info.resize(value_count);
1008  attr.values = bex_dense_cv_info.data();
1009  exII::ex_get_attribute(ex_id, &attr);
1010 
1011  bex_num_dense_cv_blocks = value_count / 2;
1012 
1013  libmesh_error_msg_if(bex_num_dense_cv_blocks > 1,
1014  "Found more than 1 dense bex CV block; unsure how to handle that");
1015  }
1016  }
1017 
1018  if (bex_dense_cv_info.empty())
1019  libmesh_error_msg("No bex_dense_cv_info found");
1020 
1021  int n_blob_vars;
1022  exII::ex_get_variable_param(ex_id, exII::EX_BLOB, &n_blob_vars);
1023  std::vector<char> var_name (libmesh_max_str_length + 1);
1024  for (auto v_id : make_range(1,n_blob_vars+1))
1025  {
1026  ex_err = exII::ex_get_variable_name(ex_id, exII::EX_BLOB, v_id, var_name.data());
1027  EX_CHECK_ERR(ex_err, "Error reading bex blob var name.");
1028 
1029  if (std::string("bex_dense_cv_blocks") == var_name.data())
1030  {
1031  std::vector<double> bex_dense_cv_blocks(my_blob->num_entry);
1032 
1033  ex_err = exII::ex_get_var(ex_id, 1, exII::EX_BLOB, v_id,
1034  my_blob->id, my_blob->num_entry,
1035  bex_dense_cv_blocks.data());
1036  EX_CHECK_ERR(ex_err, "Error reading bex_dense_cv_blocks.");
1037 
1038  bex_dense_constraint_vecs.clear();
1039  bex_dense_constraint_vecs.resize(bex_num_dense_cv_blocks);
1040 
1041  std::size_t offset = 0;
1042  for (auto i : IntRange<std::size_t>(0, bex_num_dense_cv_blocks))
1043  {
1044  bex_dense_constraint_vecs[i].resize(bex_dense_cv_info[2*i]);
1045  const int vecsize = bex_dense_cv_info[2*i+1];
1046  for (auto & vec : bex_dense_constraint_vecs[i])
1047  {
1048  vec.resize(vecsize);
1049  std::copy(std::next(bex_dense_cv_blocks.begin(), offset),
1050  std::next(bex_dense_cv_blocks.begin(), offset + vecsize),
1051  vec.begin());
1052  offset += vecsize;
1053  }
1054  }
1055  libmesh_assert(offset == bex_dense_cv_blocks.size());
1056  }
1057  }
1058  }
1059 #endif // EX_API_VERS_NODOT >= 800
1060 }
The IntRange templated class is intended to make it easy to loop over integers which are indices of a...
Definition: int_range.h:53
libmesh_assert(ctx)
static const unsigned int next[3]
A lookup table for the increment modulo 3 operation, for iterating through the three nodes per elemen...
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176
std::vector< std::vector< std::vector< Real > > > bex_dense_constraint_vecs

◆ read_block_info()

void libMesh::ExodusII_IO_Helper::read_block_info ( )
inherited

Reads information for all of the blocks in the ExodusII mesh file.

Definition at line 1071 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::block_ids, libMesh::ExodusII_IO_Helper::edge_block_ids, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::id_to_block_names, libMesh::ExodusII_IO_Helper::id_to_edge_block_names, libMesh::ExodusII_IO_Helper::message(), libMesh::ExodusII_IO_Helper::num_edge_blk, and libMesh::ExodusII_IO_Helper::num_elem_blk.

1072 {
1073  if (num_elem_blk)
1074  {
1075  // Read all element block IDs.
1076  block_ids.resize(num_elem_blk);
1077  ex_err = exII::ex_get_ids(ex_id,
1078  exII::EX_ELEM_BLOCK,
1079  block_ids.data());
1080 
1081  EX_CHECK_ERR(ex_err, "Error getting block IDs.");
1082  message("All block IDs retrieved successfully.");
1083 
1084  char name_buffer[libmesh_max_str_length+1];
1085  for (int i=0; i<num_elem_blk; ++i)
1086  {
1087  ex_err = exII::ex_get_name(ex_id, exII::EX_ELEM_BLOCK,
1088  block_ids[i], name_buffer);
1089  EX_CHECK_ERR(ex_err, "Error getting block name.");
1090  id_to_block_names[block_ids[i]] = name_buffer;
1091  }
1092  message("All block names retrieved successfully.");
1093  }
1094 
1095  if (num_edge_blk)
1096  {
1097  // Read all edge block IDs.
1098  edge_block_ids.resize(num_edge_blk);
1099  ex_err = exII::ex_get_ids(ex_id,
1100  exII::EX_EDGE_BLOCK,
1101  edge_block_ids.data());
1102 
1103  EX_CHECK_ERR(ex_err, "Error getting edge block IDs.");
1104  message("All edge block IDs retrieved successfully.");
1105 
1106  // Read in edge block names
1107  char name_buffer[libmesh_max_str_length+1];
1108  for (int i=0; i<num_edge_blk; ++i)
1109  {
1110  ex_err = exII::ex_get_name(ex_id, exII::EX_EDGE_BLOCK,
1111  edge_block_ids[i], name_buffer);
1112  EX_CHECK_ERR(ex_err, "Error getting block name.");
1113  id_to_edge_block_names[edge_block_ids[i]] = name_buffer;
1114  }
1115  message("All edge block names retrieved successfully.");
1116  }
1117 }
std::map< int, std::string > id_to_edge_block_names
void message(std::string_view msg)
Prints the message defined in msg.
std::map< int, std::string > id_to_block_names
std::vector< int > edge_block_ids

◆ read_edge_blocks()

void libMesh::ExodusII_IO_Helper::read_edge_blocks ( MeshBase mesh)
inherited

Read in edge blocks, storing information in the BoundaryInfo object.

Definition at line 1334 of file exodusII_io_helper.C.

References libMesh::BoundaryInfo::add_edge(), libMesh::Elem::build(), libMesh::ExodusII_IO_Helper::connect, libMesh::ExodusII_IO_Helper::edge_block_ids, libMesh::BoundaryInfo::edgeset_name(), libMesh::MeshBase::elem_ptr(), libMesh::ExodusII_IO_Helper::elem_type, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::FIRST, libMesh::Elem::first_order_equivalent_type(), libMesh::MeshBase::get_boundary_info(), libMesh::ExodusII_IO_Helper::get_conversion(), libMesh::ExodusII_IO_Helper::get_libmesh_node_id(), libMesh::ExodusII_IO_Helper::id_to_edge_block_names, mesh, libMesh::ExodusII_IO_Helper::message(), libMesh::MeshBase::node_ptr(), and libMesh::ExodusII_IO_Helper::num_edge_blk.

1335 {
1336  LOG_SCOPE("read_edge_blocks()", "ExodusII_IO_Helper");
1337 
1338  // Check for quick return if there are no edge blocks.
1339  if (num_edge_blk == 0)
1340  return;
1341 
1342  // Build data structure that we can quickly search for edges
1343  // and then add required BoundaryInfo information. This is a
1344  // map from edge->key() to a list of (elem_id, edge_id) pairs
1345  // for the Edge in question. Since edge->key() is edge orientation
1346  // invariant, this map does not distinguish different orientations
1347  // of the same Edge. Since edge->key() is also not guaranteed to be
1348  // unique (though it is very unlikely for two distinct edges to have
1349  // the same key()), when we later look up an (elem_id, edge_id) pair
1350  // in the edge_map, we need to verify that the edge indeed matches
1351  // the searched edge by doing some further checks.
1352  typedef std::pair<dof_id_type, unsigned int> ElemEdgePair;
1353  std::unordered_map<dof_id_type, std::vector<ElemEdgePair>> edge_map;
1354  std::unique_ptr<Elem> edge_ptr;
1355  for (const auto & elem : mesh.element_ptr_range())
1356  for (auto e : elem->edge_index_range())
1357  {
1358  elem->build_edge_ptr(edge_ptr, e);
1359  dof_id_type edge_key = edge_ptr->key();
1360 
1361  // Creates vector if not already there
1362  auto & vec = edge_map[edge_key];
1363  vec.emplace_back(elem->id(), e);
1364 
1365  // If edge_ptr is a higher-order Elem (EDGE3 or higher) then also add
1366  // a map entry for the lower-order (EDGE2) element which has matching
1367  // vertices. This allows us to match lower-order edge blocks to edges
1368  // of higher-order 3D elems (e.g. HEX20, TET10) and simplifies the
1369  // definition of edge blocks.
1370  if (edge_ptr->default_order() != FIRST)
1371  {
1372  // Construct a temporary low-order edge so that we can compute its key()
1373  auto low_order_edge =
1375 
1376  // Assign node pointers to low-order edge
1377  for (unsigned int v=0; v<edge_ptr->n_vertices(); ++v)
1378  low_order_edge->set_node(v, edge_ptr->node_ptr(v));
1379 
1380  // Compute the key for the temporary low-order edge we just built
1381  dof_id_type low_order_edge_key = low_order_edge->key();
1382 
1383  // Add this key to the map associated with the same (elem,
1384  // edge) pair as the higher-order edge
1385  auto & low_order_vec = edge_map[low_order_edge_key];
1386  low_order_vec.emplace_back(elem->id(), e);
1387  }
1388  }
1389 
1390  // Get reference to the mesh's BoundaryInfo object, as we will be
1391  // adding edges to this below.
1393 
1394  for (const auto & edge_block_id : edge_block_ids)
1395  {
1396  // exII::ex_get_block() output parameters. Unlike the other
1397  // "extended" APIs, exII::ex_get_block() does not use a
1398  // parameter struct.
1399  int num_edge_this_blk = 0;
1400  int num_nodes_per_edge = 0;
1401  int num_edges_per_edge = 0;
1402  int num_faces_per_edge = 0;
1403  int num_attr_per_edge = 0;
1404  ex_err = exII::ex_get_block(ex_id,
1405  exII::EX_EDGE_BLOCK,
1406  edge_block_id,
1407  elem_type.data(),
1408  &num_edge_this_blk,
1409  &num_nodes_per_edge,
1410  &num_edges_per_edge, // 0 or -1 for edge blocks
1411  &num_faces_per_edge, // 0 or -1 for edge blocks
1412  &num_attr_per_edge);
1413 
1414  EX_CHECK_ERR(ex_err, "Error getting edge block info.");
1415  message("Info retrieved successfully for block: ", edge_block_id);
1416 
1417  // Read in the connectivity of the edges of this block,
1418  // watching out for the case where we actually have no
1419  // elements in this block (possible with parallel files)
1420  connect.resize(num_nodes_per_edge * num_edge_this_blk);
1421 
1422  if (!connect.empty())
1423  {
1424  ex_err = exII::ex_get_conn(ex_id,
1425  exII::EX_EDGE_BLOCK,
1426  edge_block_id,
1427  connect.data(), // node_conn
1428  nullptr, // elem_edge_conn (unused)
1429  nullptr); // elem_face_conn (unused)
1430 
1431  EX_CHECK_ERR(ex_err, "Error reading block connectivity.");
1432  message("Connectivity retrieved successfully for block: ", edge_block_id);
1433 
1434  // All edge types have an identity mapping from the corresponding
1435  // Exodus type, so we don't need to bother with mapping ids, but
1436  // we do need to know what kind of elements to build.
1437  const auto & conv = get_conversion(std::string(elem_type.data()));
1438 
1439  // Loop over indices in connectivity array, build edge elements,
1440  // look them up in the edge_map.
1441  for (auto [i, sz] = std::make_tuple(0u, connect.size()); i<sz; i+=num_nodes_per_edge)
1442  {
1443  auto edge = Elem::build(conv.libmesh_elem_type());
1444  for (int n=0; n<num_nodes_per_edge; ++n)
1445  {
1446  auto exodus_node_id = this->connect[i+n];
1447  dof_id_type libmesh_node_id = this->get_libmesh_node_id(exodus_node_id);
1448  edge->set_node(n, mesh.node_ptr(libmesh_node_id));
1449  }
1450 
1451  // Compute key for the edge Elem we just built.
1452  dof_id_type edge_key = edge->key();
1453 
1454  // If this key is not found in the edge_map, which is
1455  // supposed to include every edge in the Mesh, then we
1456  // will throw an error now.
1457  auto & elem_edge_pair_vec =
1458  libmesh_map_find(edge_map, edge_key);
1459 
1460  for (const auto & elem_edge_pair : elem_edge_pair_vec)
1461  {
1462  // We only want to match edges which have the same
1463  // nodes (possibly with different orientation) to the one in the
1464  // Exodus file, otherwise we ignore this elem_edge_pair.
1465  //
1466  // Note: this also handles the situation where two
1467  // edges have the same key (hash collision) as then
1468  // this check avoids a false positive.
1469 
1470  // Build edge indicated by elem_edge_pair
1471  mesh.elem_ptr(elem_edge_pair.first)->
1472  build_edge_ptr(edge_ptr, elem_edge_pair.second);
1473 
1474  // Determine whether this candidate edge is a "real" match,
1475  // i.e. has the same nodes with a possibly different
1476  // orientation. Note that here we only check that
1477  // the vertices match regardless of how many nodes
1478  // the edge has, which allows us to match a
1479  // lower-order edge to a higher-order Elem.
1480  bool is_match =
1481  ((edge_ptr->node_id(0) == edge->node_id(0)) && (edge_ptr->node_id(1) == edge->node_id(1))) ||
1482  ((edge_ptr->node_id(0) == edge->node_id(1)) && (edge_ptr->node_id(1) == edge->node_id(0)));
1483 
1484  if (is_match)
1485  {
1486  // Add this (elem, edge, id) combo to the BoundaryInfo object.
1487  bi.add_edge(elem_edge_pair.first,
1488  elem_edge_pair.second,
1489  edge_block_id);
1490  }
1491  } // end loop over elem_edge_pairs
1492  } // end loop over connectivity array
1493 
1494  // Set edgeset name in the BoundaryInfo object.
1495  bi.edgeset_name(edge_block_id) = id_to_edge_block_names[edge_block_id];
1496  } // end if !connect.empty()
1497  } // end for edge_block_id : edge_block_ids
1498 }
std::map< int, std::string > id_to_edge_block_names
MeshBase & mesh
const ExodusII_IO_Helper::Conversion & get_conversion(const ElemType type) const
const BoundaryInfo & get_boundary_info() const
The information about boundary ids on the mesh.
Definition: mesh_base.h:170
void message(std::string_view msg)
Prints the message defined in msg.
static std::unique_ptr< Elem > build(const ElemType type, Elem *p=nullptr)
Definition: elem.C:442
The BoundaryInfo class contains information relevant to boundary conditions including storing faces...
Definition: boundary_info.h:57
virtual const Elem * elem_ptr(const dof_id_type i) const =0
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::string & edgeset_name(boundary_id_type id)
virtual const Node * node_ptr(const dof_id_type i) const =0
std::vector< int > edge_block_ids
static ElemType first_order_equivalent_type(const ElemType et)
Definition: elem.C:3099
uint8_t dof_id_type
Definition: id_types.h:67
void add_edge(const dof_id_type elem, const unsigned short int edge, const boundary_id_type id)
Add edge edge of element number elem with boundary id id to the boundary information data structure...

◆ read_elem_in_block()

void libMesh::ExodusII_IO_Helper::read_elem_in_block ( int  block)
inherited

Reads all of the element connectivity for block block in the ExodusII mesh file.

Definition at line 1176 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::bex_cv_conn, libMesh::ExodusII_IO_Helper::bex_num_elem_cvs, libMesh::ExodusII_IO_Helper::block_ids, libMesh::ExodusII_IO_Helper::connect, libMesh::ExodusII_IO_Helper::elem_type, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::get_conversion(), libMesh::libmesh_assert(), libMesh::ExodusII_IO_Helper::message(), libMesh::ExodusII_IO_Helper::num_attr, libMesh::ExodusII_IO_Helper::num_elem_this_blk, libMesh::ExodusII_IO_Helper::num_nodes_per_elem, libMesh::out, and libMesh::ExodusII_IO_Helper::verbose.

1177 {
1178  LOG_SCOPE("read_elem_in_block()", "ExodusII_IO_Helper");
1179 
1180  libmesh_assert_less (block, block_ids.size());
1181 
1182  // Unlike the other "extended" APIs, this one does not use a parameter struct.
1183  int num_edges_per_elem = 0;
1184  int num_faces_per_elem = 0;
1185  int num_node_data_per_elem = 0;
1186  ex_err = exII::ex_get_block(ex_id,
1187  exII::EX_ELEM_BLOCK,
1188  block_ids[block],
1189  elem_type.data(),
1191  &num_node_data_per_elem,
1192  &num_edges_per_elem, // 0 or -1 if no "extended" block info
1193  &num_faces_per_elem, // 0 or -1 if no "extended" block info
1194  &num_attr);
1195 
1196  EX_CHECK_ERR(ex_err, "Error getting block info.");
1197  message("Info retrieved successfully for block: ", block);
1198 
1199  // Warn that we don't currently support reading blocks with extended info.
1200  // Note: the docs say -1 will be returned for this but I found that it was
1201  // actually 0, so not sure which it will be in general.
1202  if (!(num_edges_per_elem == 0) && !(num_edges_per_elem == -1))
1203  libmesh_warning("Exodus files with extended edge connectivity not currently supported.");
1204  if (!(num_faces_per_elem == 0) && !(num_faces_per_elem == -1))
1205  libmesh_warning("Exodus files with extended face connectivity not currently supported.");
1206 
1207  // If we have a Bezier element here, then we've packed constraint
1208  // vector connectivity at the end of the nodal connectivity, and
1209  // num_nodes_per_elem reflected both.
1210  const bool is_bezier = is_bezier_elem(elem_type.data());
1211  if (is_bezier)
1212  {
1213  const auto & conv = get_conversion(std::string(elem_type.data()));
1214  num_nodes_per_elem = conv.n_nodes;
1215  }
1216  else
1217  num_nodes_per_elem = num_node_data_per_elem;
1218 
1219  if (verbose)
1220  libMesh::out << "Read a block of " << num_elem_this_blk
1221  << " " << elem_type.data() << "(s)"
1222  << " having " << num_nodes_per_elem
1223  << " nodes per element." << std::endl;
1224 
1225  // Read in the connectivity of the elements of this block,
1226  // watching out for the case where we actually have no
1227  // elements in this block (possible with parallel files)
1228  connect.resize(num_node_data_per_elem*num_elem_this_blk);
1229 
1230  if (!connect.empty())
1231  {
1232  ex_err = exII::ex_get_conn(ex_id,
1233  exII::EX_ELEM_BLOCK,
1234  block_ids[block],
1235  connect.data(), // node_conn
1236  nullptr, // elem_edge_conn (unused)
1237  nullptr); // elem_face_conn (unused)
1238 
1239  EX_CHECK_ERR(ex_err, "Error reading block connectivity.");
1240  message("Connectivity retrieved successfully for block: ", block);
1241  }
1242 
1243  // If we had any attributes for this block, check to see if some of
1244  // them were Bezier-extension attributes.
1245 
1246  // num_attr above is zero, not actually the number of block attributes?
1247  // ex_get_attr_param *also* gives me zero? Really, Exodus?
1248 #if EX_API_VERS_NODOT >= 800
1249  int real_n_attr = exII::ex_get_attribute_count(ex_id, exII::EX_ELEM_BLOCK, block_ids[block]);
1250  EX_CHECK_ERR(real_n_attr, "Error getting number of element block attributes.");
1251 
1252  if (real_n_attr > 0)
1253  {
1254  std::vector<exII::ex_attribute> attributes(real_n_attr);
1255 
1256  ex_err = exII::ex_get_attribute_param(ex_id, exII::EX_ELEM_BLOCK, block_ids[block], attributes.data());
1257  EX_CHECK_ERR(ex_err, "Error getting element block attribute parameters.");
1258 
1259  ex_err = exII::ex_get_attributes(ex_id, real_n_attr, attributes.data());
1260  EX_CHECK_ERR(ex_err, "Error getting element block attribute values.");
1261 
1262  for (auto attr : attributes)
1263  {
1264  if (std::string("bex_elem_degrees") == attr.name)
1265  {
1266  if (attr.type != exII::EX_INTEGER)
1267  libmesh_error_msg("Found non-integer bex_elem_degrees");
1268 
1269  if (attr.value_count > 3)
1270  libmesh_error_msg("Looking for at most 3 bex_elem_degrees; found " << attr.value_count);
1271 
1272  libmesh_assert(is_bezier);
1273 
1274  std::vector<int> bex_elem_degrees(3); // max dim
1275 
1276  const int * as_int = static_cast<int *>(attr.values);
1277  std::copy(as_int, as_int+attr.value_count, bex_elem_degrees.begin());
1278 
1279 
1280  // Right now Bezier extraction elements aren't possible
1281  // for p>2 and aren't useful for p<2, and we don't
1282  // support anisotropic p...
1283 #ifndef NDEBUG
1284  const auto & conv = get_conversion(std::string(elem_type.data()));
1285 
1286  for (auto d : IntRange<int>(0, conv.dim))
1287  libmesh_assert_equal_to(bex_elem_degrees[d], 2);
1288 #endif
1289  }
1290  // ex_get_attributes did a values=calloc(); free() is our job.
1291  if (attr.values)
1292  free(attr.values);
1293  }
1294  }
1295 
1296  if (is_bezier)
1297  {
1298  // We'd better have the number of cvs we expect
1299  if( num_node_data_per_elem > num_nodes_per_elem )
1300  bex_num_elem_cvs = num_node_data_per_elem / 2;
1301  else
1303  libmesh_assert_greater_equal(bex_num_elem_cvs, 0);
1304 
1305  // The old connect vector is currently a mix of the expected
1306  // connectivity and any Bezier extraction connectivity;
1307  // disentangle that, if necessary.
1309  if (num_node_data_per_elem > num_nodes_per_elem)
1310  {
1311  std::vector<int> old_connect(bex_num_elem_cvs * num_elem_this_blk);
1312  old_connect.swap(connect);
1313  auto src = old_connect.data();
1314  auto dst = connect.data();
1315  for (auto e : IntRange<std::size_t>(0, num_elem_this_blk))
1316  {
1317  std::copy(src, src + bex_num_elem_cvs, dst);
1318  src += bex_num_elem_cvs;
1319  dst += bex_num_elem_cvs;
1320 
1321  bex_cv_conn[e].resize(bex_num_elem_cvs);
1322  std::copy(src, src + bex_num_elem_cvs,
1323  bex_cv_conn[e].begin());
1324  src += bex_num_elem_cvs;
1325  }
1326  }
1327  }
1328 
1329 #endif // EX_API_VERS_NODOT >= 800
1330 }
The IntRange templated class is intended to make it easy to loop over integers which are indices of a...
Definition: int_range.h:53
const ExodusII_IO_Helper::Conversion & get_conversion(const ElemType type) const
void message(std::string_view msg)
Prints the message defined in msg.
libmesh_assert(ctx)
OStreamProxy out
std::vector< std::vector< long unsigned int > > bex_cv_conn

◆ read_elem_num_map()

void libMesh::ExodusII_IO_Helper::read_elem_num_map ( )
inherited

Reads the optional node_num_map from the ExodusII mesh file.

Definition at line 1502 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_end_elem_id, libMesh::ExodusII_IO_Helper::elem_num_map, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::message(), libMesh::ExodusII_IO_Helper::num_elem, libMesh::out, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

1503 {
1504  elem_num_map.resize(num_elem);
1505 
1506  // Note: we cannot use the exII::ex_get_num_map() here because it
1507  // (apparently) does not behave like ex_get_elem_num_map() when
1508  // there is no elem number map in the file: it throws an error
1509  // instead of returning a default identity array (1,2,3,...).
1510  ex_err = exII::ex_get_elem_num_map
1511  (ex_id, elem_num_map.empty() ? nullptr : elem_num_map.data());
1512 
1513  EX_CHECK_ERR(ex_err, "Error retrieving element number map.");
1514  message("Element numbering map retrieved successfully.");
1515 
1516  if (num_elem)
1517  {
1518  // The elem_num_map may contain ids larger than num_elem. In
1519  // other words, the elem_num_map is not necessarily just a
1520  // permutation of the "trivial" 1,2,3,... mapping, it can
1521  // contain effectively "any" numbers. Therefore, to get
1522  // "_end_elem_id", we need to check what the max entry in the
1523  // elem_num_map is.
1524  auto it = std::max_element(elem_num_map.begin(), elem_num_map.end());
1525  _end_elem_id = *it;
1526  }
1527  else
1528  _end_elem_id = 0;
1529 
1530  if (verbose)
1531  {
1532  libMesh::out << "[" << this->processor_id() << "] elem_num_map[i] = ";
1533  for (unsigned int i=0; i<static_cast<unsigned int>(std::min(10, num_elem-1)); ++i)
1534  libMesh::out << elem_num_map[i] << ", ";
1535  libMesh::out << "... " << elem_num_map.back() << std::endl;
1536  }
1537 }
void message(std::string_view msg)
Prints the message defined in msg.
OStreamProxy out
processor_id_type processor_id() const

◆ read_elemental_var_values()

void libMesh::ExodusII_IO_Helper::read_elemental_var_values ( std::string  elemental_var_name,
int  time_step,
std::map< dof_id_type, Real > &  elem_var_value_map 
)
inherited

Reads elemental values for the variable 'elemental_var_name' at the specified timestep into the 'elem_var_value_map' which is passed in.

Definition at line 2096 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::block_ids, libMesh::ExodusII_IO_Helper::elem_var_names, libMesh::ExodusII_IO_Helper::ELEMENTAL, libMesh::err, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::get_libmesh_elem_id(), libMesh::ExodusII_IO_Helper::num_elem_blk, libMesh::ExodusII_IO_Helper::num_elem_this_blk, and libMesh::ExodusII_IO_Helper::read_var_names().

2099 {
2100  LOG_SCOPE("read_elemental_var_values()", "ExodusII_IO_Helper");
2101 
2102  this->read_var_names(ELEMENTAL);
2103 
2104  // See if we can find the variable we are looking for
2105  unsigned int var_index = 0;
2106  bool found = false;
2107 
2108  // Do a linear search for elem_var_name in elemental_var_names
2109  for (; var_index != elem_var_names.size(); ++var_index)
2110  if (elem_var_names[var_index] == elemental_var_name)
2111  {
2112  found = true;
2113  break;
2114  }
2115 
2116  if (!found)
2117  {
2118  libMesh::err << "Available variables: " << std::endl;
2119  for (const auto & var_name : elem_var_names)
2120  libMesh::err << var_name << std::endl;
2121 
2122  libmesh_error_msg("Unable to locate variable named: " << elemental_var_name);
2123  }
2124 
2125  // Sequential index which we can use to look up the element ID in the elem_num_map.
2126  unsigned ex_el_num = 0;
2127 
2128  // Element variable truth table
2129  std::vector<int> var_table(block_ids.size() * elem_var_names.size());
2130  exII::ex_get_truth_table(ex_id, exII::EX_ELEM_BLOCK, block_ids.size(), elem_var_names.size(), var_table.data());
2131 
2132  for (unsigned i=0; i<static_cast<unsigned>(num_elem_blk); i++)
2133  {
2134  ex_err = exII::ex_get_block(ex_id,
2135  exII::EX_ELEM_BLOCK,
2136  block_ids[i],
2137  /*elem_type=*/nullptr,
2139  /*num_nodes_per_entry=*/nullptr,
2140  /*num_edges_per_entry=*/nullptr,
2141  /*num_faces_per_entry=*/nullptr,
2142  /*num_attr=*/nullptr);
2143  EX_CHECK_ERR(ex_err, "Error getting number of elements in block.");
2144 
2145  // If the current variable isn't active on this subdomain, advance
2146  // the index by the number of elements on this block and go to the
2147  // next loop iteration.
2148  if (!var_table[elem_var_names.size()*i + var_index])
2149  {
2150  ex_el_num += num_elem_this_blk;
2151  continue;
2152  }
2153 
2154  std::vector<Real> block_elem_var_values(num_elem_this_blk);
2155 
2156  ex_err = exII::ex_get_var
2157  (ex_id,
2158  time_step,
2159  exII::EX_ELEM_BLOCK,
2160  var_index+1,
2161  block_ids[i],
2163  MappedInputVector(block_elem_var_values, _single_precision).data());
2164  EX_CHECK_ERR(ex_err, "Error getting elemental values.");
2165 
2166  for (unsigned j=0; j<static_cast<unsigned>(num_elem_this_blk); j++)
2167  {
2168  // Determine the libmesh id of the element with zero-based
2169  // index "ex_el_num". This function expects a one-based
2170  // index, so we add 1 to ex_el_num when we pass it in.
2171  auto libmesh_elem_id =
2172  this->get_libmesh_elem_id(ex_el_num + 1);
2173 
2174  // Store the elemental value in the map.
2175  elem_var_value_map[libmesh_elem_id] = block_elem_var_values[j];
2176 
2177  // Go to the next sequential element ID.
2178  ex_el_num++;
2179  }
2180  }
2181 }
OStreamProxy err
std::vector< std::string > elem_var_names
void read_var_names(ExodusVarType type)
dof_id_type get_libmesh_elem_id(int exodus_elem_id)

◆ read_elemset()

void libMesh::ExodusII_IO_Helper::read_elemset ( int  id,
int  offset 
)
inherited

Reads information about elemset id and inserts it into the global elemset array at the position offset.

Definition at line 1692 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::elemset_id_list, libMesh::ExodusII_IO_Helper::elemset_ids, libMesh::ExodusII_IO_Helper::elemset_list, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::message(), libMesh::ExodusII_IO_Helper::num_elem_df_per_set, and libMesh::ExodusII_IO_Helper::num_elems_per_set.

Referenced by libMesh::ExodusII_IO_Helper::write_elemset_data().

1693 {
1694  LOG_SCOPE("read_elemset()", "ExodusII_IO_Helper");
1695 
1696  libmesh_assert_less (id, elemset_ids.size());
1697  libmesh_assert_less (id, num_elems_per_set.size());
1698  libmesh_assert_less (id, num_elem_df_per_set.size());
1699  libmesh_assert_less_equal (offset, elemset_list.size());
1700 
1701  ex_err = exII::ex_get_set_param(ex_id,
1702  exII::EX_ELEM_SET,
1703  elemset_ids[id],
1704  &num_elems_per_set[id],
1705  &num_elem_df_per_set[id]);
1706  EX_CHECK_ERR(ex_err, "Error retrieving elemset parameters.");
1707  message("Parameters retrieved successfully for elemset: ", id);
1708 
1709 
1710  // It's OK for offset==elemset_list.size() as long as num_elems_per_set[id]==0
1711  // because in that case we don't actually read anything...
1712  #ifdef DEBUG
1713  if (static_cast<unsigned int>(offset) == elemset_list.size())
1714  libmesh_assert_equal_to (num_elems_per_set[id], 0);
1715  #endif
1716 
1717  // Don't call ex_get_set() unless there are actually elems there to get.
1718  // Exodus prints an annoying warning in DEBUG mode otherwise...
1719  if (num_elems_per_set[id] > 0)
1720  {
1721  ex_err = exII::ex_get_set(ex_id,
1722  exII::EX_ELEM_SET,
1723  elemset_ids[id],
1724  &elemset_list[offset],
1725  /*set_extra_list=*/nullptr);
1726  EX_CHECK_ERR(ex_err, "Error retrieving elemset data.");
1727  message("Data retrieved successfully for elemset: ", id);
1728 
1729  // Create vector containing elemset ids for each element in the set
1730  for (int i=0; i<num_elems_per_set[id]; i++)
1731  elemset_id_list[i+offset] = elemset_ids[id];
1732  }
1733 }
std::vector< int > num_elems_per_set
void message(std::string_view msg)
Prints the message defined in msg.
std::vector< int > elemset_id_list
std::vector< int > num_elem_df_per_set

◆ read_elemset_data()

void libMesh::ExodusII_IO_Helper::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 
)
inherited

Read elemset variables, if any, into the provided data structures.

Definition at line 4202 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::ELEMSET, libMesh::ExodusII_IO_Helper::elemset_ids, libMesh::ExodusII_IO_Helper::elemset_list, libMesh::ExodusII_IO_Helper::elemset_var_names, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::num_elem_sets, libMesh::ExodusII_IO_Helper::num_elems_per_set, libMesh::ExodusII_IO_Helper::num_elemset_vars, and libMesh::ExodusII_IO_Helper::read_var_names().

4206 {
4207  LOG_SCOPE("read_elemset_data()", "ExodusII_IO_Helper");
4208 
4209  // This reads the elemset variable names into the local
4210  // elemset_var_names data structure.
4211  this->read_var_names(ELEMSET);
4212 
4213  // Debugging
4214  // libMesh::out << "elmeset variable names:" << std::endl;
4215  // for (const auto & name : elemset_var_names)
4216  // libMesh::out << name << " ";
4217  // libMesh::out << std::endl;
4218 
4219  if (num_elemset_vars)
4220  {
4221  // Debugging
4222  // std::cout << "Reading " << num_elem_sets
4223  // << " elemsets and " << num_elemset_vars
4224  // << " elemset variables." << std::endl;
4225 
4226  // Read the elemset data truth table.
4227  std::vector<int> elemset_var_tab(num_elem_sets * num_elemset_vars);
4228  exII::ex_get_truth_table(ex_id,
4229  exII::EX_ELEM_SET, // exII::ex_entity_type
4230  num_elem_sets,
4232  elemset_var_tab.data());
4233  EX_CHECK_ERR(ex_err, "Error reading elemset variable truth table.");
4234 
4235  // Debugging
4236  // libMesh::out << "Elemset variable truth table:" << std::endl;
4237  // for (const auto & val : elemset_var_tab)
4238  // libMesh::out << val << " ";
4239  // libMesh::out << std::endl;
4240 
4241  // Debugging
4242  // for (auto i : make_range(num_elem_sets))
4243  // {
4244  // for (auto j : make_range(num_elemset_vars))
4245  // libMesh::out << elemset_var_tab[num_elemset_vars*i + j] << " ";
4246  // libMesh::out << std::endl;
4247  // }
4248 
4249  // Set up/allocate space in incoming data structures. All vectors are
4250  // num_elemset_vars in length.
4251  var_names = elemset_var_names;
4252  elemset_ids_in.resize(num_elemset_vars);
4253  elemset_vals.resize(num_elemset_vars);
4254 
4255  // Read the elemset data
4256  int offset=0;
4257  for (int es=0; es<num_elem_sets; ++es)
4258  {
4259  offset += (es > 0 ? num_elems_per_set[es-1] : 0);
4260  for (int var=0; var<num_elemset_vars; ++var)
4261  {
4262  int is_present = elemset_var_tab[num_elemset_vars*es + var];
4263 
4264  if (is_present)
4265  {
4266  // Debugging
4267  // libMesh::out << "Variable " << var << " is present on elemset " << es << std::endl;
4268 
4269  // Record the fact that this variable is defined on this elemset.
4270  elemset_ids_in[var].insert(elemset_ids[es]);
4271 
4272  // Note: the assumption here is that a previous call
4273  // to this->read_elemset_info() has already set the
4274  // values of num_elems_per_set, so we just use those values here.
4275  std::vector<Real> elemset_var_vals(num_elems_per_set[es]);
4276  ex_err = exII::ex_get_var
4277  (ex_id,
4278  timestep,
4279  exII::EX_ELEM_SET, // exII::ex_entity_type
4280  var + 1, // 1-based sideset variable index!
4281  elemset_ids[es],
4282  num_elems_per_set[es],
4283  MappedInputVector(elemset_var_vals, _single_precision).data());
4284  EX_CHECK_ERR(ex_err, "Error reading elemset variable.");
4285 
4286  for (int i=0; i<num_elems_per_set[es]; ++i)
4287  {
4288  dof_id_type exodus_elem_id = elemset_list[i + offset];
4289 
4290  // FIXME: We should use exodus_elem_num_to_libmesh for this,
4291  // but it apparently is never set up, so just
4292  // subtract 1 from the Exodus elem id.
4293  dof_id_type converted_elem_id = exodus_elem_id - 1;
4294 
4295  // Make key based on the elem and set ids
4296  auto key = std::make_pair(converted_elem_id,
4297  static_cast<elemset_id_type>(elemset_ids[es]));
4298 
4299  // Store value in the map
4300  elemset_vals[var].emplace(key, elemset_var_vals[i]);
4301  } // end for (i)
4302  } // end if (present)
4303  } // end for (var)
4304  } // end for (es)
4305  } // end if (num_elemset_vars)
4306 }
std::vector< int > num_elems_per_set
void read_var_names(ExodusVarType type)
std::vector< std::string > elemset_var_names
uint8_t dof_id_type
Definition: id_types.h:67

◆ read_elemset_info()

void libMesh::ExodusII_IO_Helper::read_elemset_info ( )
inherited

Reads information about all of the elemsets in the ExodusII mesh file.

Definition at line 1605 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::elemset_id_list, libMesh::ExodusII_IO_Helper::elemset_ids, libMesh::ExodusII_IO_Helper::elemset_list, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::id_to_elemset_names, libMesh::ExodusII_IO_Helper::message(), libMesh::ExodusII_IO_Helper::num_elem_all_elemsets, libMesh::ExodusII_IO_Helper::num_elem_df_per_set, libMesh::ExodusII_IO_Helper::num_elem_sets, and libMesh::ExodusII_IO_Helper::num_elems_per_set.

Referenced by libMesh::ExodusII_IO_Helper::write_elemset_data().

1606 {
1607  elemset_ids.resize(num_elem_sets);
1608  if (num_elem_sets > 0)
1609  {
1610  ex_err = exII::ex_get_ids(ex_id,
1611  exII::EX_ELEM_SET,
1612  elemset_ids.data());
1613  EX_CHECK_ERR(ex_err, "Error retrieving elemset information.");
1614  message("All elemset information retrieved successfully.");
1615 
1616  // Resize appropriate data structures -- only do this once outside the loop
1619 
1620  // Inquire about the length of the concatenated elemset list
1622  inquire(*this, exII::EX_INQ_ELS_LEN,
1623  "Error retrieving length of the concatenated elem sets element list!");
1624 
1627 
1628  // Debugging
1629  // libMesh::out << "num_elem_all_elemsets = " << num_elem_all_elemsets << std::endl;
1630  }
1631 
1632  char name_buffer[libmesh_max_str_length+1];
1633  for (int i=0; i<num_elem_sets; ++i)
1634  {
1635  ex_err = exII::ex_get_name(ex_id, exII::EX_ELEM_SET,
1636  elemset_ids[i], name_buffer);
1637  EX_CHECK_ERR(ex_err, "Error getting node set name.");
1638  id_to_elemset_names[elemset_ids[i]] = name_buffer;
1639  }
1640  message("All elem set names retrieved successfully.");
1641 }
std::vector< int > num_elems_per_set
void message(std::string_view msg)
Prints the message defined in msg.
std::map< int, std::string > id_to_elemset_names
std::vector< int > elemset_id_list
std::vector< int > num_elem_df_per_set

◆ read_global_values()

void libMesh::ExodusII_IO_Helper::read_global_values ( std::vector< Real > &  values,
int  timestep 
)
inherited

Reads the vector of global variables.

Definition at line 4818 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_run_only_on_proc0, libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::num_global_vars, and libMesh::ParallelObject::processor_id().

4819 {
4820  if ((_run_only_on_proc0) && (this->processor_id() != 0))
4821  return;
4822 
4823  values.clear();
4824  values.resize(num_global_vars);
4825  ex_err = exII::ex_get_var
4826  (ex_id,
4827  timestep,
4828  exII::EX_GLOBAL,
4829  1, // var_index
4830  1, // obj_id
4832  MappedInputVector(values, _single_precision).data());
4833 
4834  EX_CHECK_ERR(ex_err, "Error reading global values.");
4835 }
processor_id_type processor_id() const

◆ read_header()

ExodusHeaderInfo libMesh::ExodusII_IO_Helper::read_header ( ) const
inherited

Reads an ExodusII mesh file header, leaving this object's internal data structures unchanged.

Definition at line 736 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusHeaderInfo::num_dim, libMesh::ExodusHeaderInfo::num_edge, libMesh::ExodusHeaderInfo::num_edge_blk, libMesh::ExodusHeaderInfo::num_elem, libMesh::ExodusHeaderInfo::num_elem_blk, libMesh::ExodusHeaderInfo::num_elem_sets, libMesh::ExodusHeaderInfo::num_node_sets, libMesh::ExodusHeaderInfo::num_nodes, libMesh::ExodusHeaderInfo::num_side_sets, and libMesh::ExodusHeaderInfo::title.

Referenced by libMesh::ExodusII_IO_Helper::read_and_store_header_info().

737 {
738  // Read init params using newer API that reads into a struct. For
739  // backwards compatibility, assign local member values from struct
740  // afterwards. Note: using the new API allows us to automatically
741  // read edge and face block/set information if it's present in the
742  // file.
743  exII::ex_init_params params = {};
744  int err_flag = exII::ex_get_init_ext(ex_id, &params);
745  EX_CHECK_ERR(err_flag, "Error retrieving header info.");
746 
747  // Extract required data into our struct
749  h.title.assign(params.title, params.title + MAX_LINE_LENGTH);
750  h.num_dim = params.num_dim;
751  h.num_nodes = params.num_nodes;
752  h.num_elem = params.num_elem;
753  h.num_elem_blk = params.num_elem_blk;
754  h.num_node_sets = params.num_node_sets;
755  h.num_side_sets = params.num_side_sets;
756  h.num_elem_sets = params.num_elem_sets;
757  h.num_edge_blk = params.num_edge_blk;
758  h.num_edge = params.num_edge;
759 
760  // And return it
761  return h;
762 }
This class is used as both an external data structure for passing around Exodus file header informati...
std::vector< char > title

◆ read_nodal_var_values()

void libMesh::ExodusII_IO_Helper::read_nodal_var_values ( std::string  nodal_var_name,
int  time_step 
)
inherited

Reads the nodal values for the variable 'nodal_var_name' at the specified time into the 'nodal_var_values' array.

Definition at line 1871 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_single_precision, libMesh::err, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::get_libmesh_node_id(), libMesh::make_range(), libMesh::ExodusII_IO_Helper::NODAL, libMesh::ExodusII_IO_Helper::nodal_var_names, libMesh::ExodusII_IO_Helper::nodal_var_values, libMesh::ExodusII_IO_Helper::num_nodes, and libMesh::ExodusII_IO_Helper::read_var_names().

1872 {
1873  LOG_SCOPE("read_nodal_var_values()", "ExodusII_IO_Helper");
1874 
1875  // Read the nodal variable names from file, so we can see if we have the one we're looking for
1876  this->read_var_names(NODAL);
1877 
1878  // See if we can find the variable we are looking for
1879  unsigned int var_index = 0;
1880  bool found = false;
1881 
1882  // Do a linear search for nodal_var_name in nodal_var_names
1883  for (; var_index<nodal_var_names.size(); ++var_index)
1884  {
1885  found = (nodal_var_names[var_index] == nodal_var_name);
1886  if (found)
1887  break;
1888  }
1889 
1890  if (!found)
1891  {
1892  libMesh::err << "Available variables: " << std::endl;
1893  for (const auto & var_name : nodal_var_names)
1894  libMesh::err << var_name << std::endl;
1895 
1896  libmesh_error_msg("Unable to locate variable named: " << nodal_var_name);
1897  }
1898 
1899  // Clear out any previously read nodal variable values
1900  this->nodal_var_values.clear();
1901 
1902  std::vector<Real> unmapped_nodal_var_values(num_nodes);
1903 
1904  // Call the Exodus API to read the nodal variable values
1905  ex_err = exII::ex_get_var
1906  (ex_id,
1907  time_step,
1908  exII::EX_NODAL,
1909  var_index+1,
1910  1, // exII::ex_entity_id, not sure exactly what this is but in the ex_get_nodal_var.c shim, they pass 1
1911  num_nodes,
1912  MappedInputVector(unmapped_nodal_var_values, _single_precision).data());
1913  EX_CHECK_ERR(ex_err, "Error reading nodal variable values!");
1914 
1915  for (auto i : make_range(num_nodes))
1916  {
1917  // Determine the libmesh node id implied by "i". The
1918  // get_libmesh_node_id() helper function expects a 1-based
1919  // Exodus node id, so we construct the "implied" Exodus node id
1920  // from "i" by adding 1.
1921  //
1922  // If the user has set the "set_unique_ids_from_maps" flag to
1923  // true, then calling get_libmesh_node_id(i+1) will just return
1924  // i, otherwise it will determine the value (with error
1925  // checking) using this->node_num_map.
1926  auto libmesh_node_id = this->get_libmesh_node_id(/*exodus_node_id=*/i+1);
1927 
1928  // Store the nodal value in the map.
1929  this->nodal_var_values[libmesh_node_id] = unmapped_nodal_var_values[i];
1930  }
1931 }
OStreamProxy err
std::map< dof_id_type, Real > nodal_var_values
void read_var_names(ExodusVarType type)
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176
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::string > nodal_var_names

◆ read_node_num_map()

void libMesh::ExodusII_IO_Helper::read_node_num_map ( )
inherited

Reads the optional node_num_map from the ExodusII mesh file.

Definition at line 927 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::message(), libMesh::ExodusII_IO_Helper::node_num_map, libMesh::ExodusII_IO_Helper::num_nodes, libMesh::out, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

928 {
929  node_num_map.resize(num_nodes);
930 
931  // Note: we cannot use the exII::ex_get_num_map() here because it
932  // (apparently) does not behave like ex_get_node_num_map() when
933  // there is no node number map in the file: it throws an error
934  // instead of returning a default identity array (1,2,3,...).
935  ex_err = exII::ex_get_node_num_map
936  (ex_id, node_num_map.empty() ? nullptr : node_num_map.data());
937 
938  EX_CHECK_ERR(ex_err, "Error retrieving nodal number map.");
939  message("Nodal numbering map retrieved successfully.");
940 
941  if (verbose)
942  {
943  libMesh::out << "[" << this->processor_id() << "] node_num_map[i] = ";
944  for (unsigned int i=0; i<static_cast<unsigned int>(std::min(10, num_nodes-1)); ++i)
945  libMesh::out << node_num_map[i] << ", ";
946  libMesh::out << "... " << node_num_map.back() << std::endl;
947  }
948 }
void message(std::string_view msg)
Prints the message defined in msg.
OStreamProxy out
processor_id_type processor_id() const

◆ read_nodes()

void libMesh::ExodusII_IO_Helper::read_nodes ( )
inherited

Reads the nodal data (x,y,z coordinates) from the ExodusII mesh file.

Definition at line 876 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::index_range(), libMesh::ExodusII_IO_Helper::message(), libMesh::ExodusII_IO_Helper::num_nodes, libMesh::ExodusII_IO_Helper::w, libMesh::ExodusII_IO_Helper::x, libMesh::ExodusII_IO_Helper::y, and libMesh::ExodusII_IO_Helper::z.

877 {
878  LOG_SCOPE("read_nodes()", "ExodusII_IO_Helper");
879 
880  x.resize(num_nodes);
881  y.resize(num_nodes);
882  z.resize(num_nodes);
883 
884  if (num_nodes)
885  {
886  ex_err = exII::ex_get_coord
887  (ex_id,
888  MappedInputVector(x, _single_precision).data(),
889  MappedInputVector(y, _single_precision).data(),
890  MappedInputVector(z, _single_precision).data());
891 
892  EX_CHECK_ERR(ex_err, "Error retrieving nodal data.");
893  message("Nodal data retrieved successfully.");
894  }
895 
896  // If a nodal attribute bex_weight exists, we get spline weights
897  // from it
898  int n_nodal_attr = 0;
899  ex_err = exII::ex_get_attr_param(ex_id, exII::EX_NODAL, 0, & n_nodal_attr);
900  EX_CHECK_ERR(ex_err, "Error getting number of nodal attributes.");
901 
902  if (n_nodal_attr > 0)
903  {
904  std::vector<std::vector<char>> attr_name_data
905  (n_nodal_attr, std::vector<char>(libmesh_max_str_length + 1));
906  std::vector<char *> attr_names(n_nodal_attr);
907  for (auto i : index_range(attr_names))
908  attr_names[i] = attr_name_data[i].data();
909 
910  ex_err = exII::ex_get_attr_names(ex_id, exII::EX_NODAL, 0, attr_names.data());
911  EX_CHECK_ERR(ex_err, "Error getting nodal attribute names.");
912 
913  for (auto i : index_range(attr_names))
914  if (std::string("bex_weight") == attr_names[i])
915  {
916  w.resize(num_nodes);
917  ex_err =
918  exII::ex_get_one_attr (ex_id, exII::EX_NODAL, 0, i+1,
919  MappedInputVector(w, _single_precision).data());
920  EX_CHECK_ERR(ex_err, "Error getting Bezier Extraction nodal weights");
921  }
922  }
923 }
void message(std::string_view msg)
Prints the message defined in msg.
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153

◆ read_nodeset()

void libMesh::Nemesis_IO_Helper::read_nodeset ( int  id)

Reading functions.

These just allocate memory for you and call the Nemesis routines of the same name. They also handle error checking for the Nemesis return value. Be careful calling these at random, some depend on others being called first... Reads the node ids of nodeset id and stores them in the node_list member of this class.

Note
This used to be an ExodusII_IO_Helper function but it use was completely replaced by read_all_nodesets(). For now, it is still used by the Nemesis reader so we have moved it here.

Definition at line 118 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::message(), node_list, libMesh::ExodusII_IO_Helper::nodeset_ids, libMesh::ExodusII_IO_Helper::num_node_df_per_set, and libMesh::ExodusII_IO_Helper::num_nodes_per_set.

119 {
120  libmesh_assert_less (id, nodeset_ids.size());
121  libmesh_assert_less (id, num_nodes_per_set.size());
122  libmesh_assert_less (id, num_node_df_per_set.size());
123 
124  ex_err = exII::ex_get_set_param(ex_id,
125  exII::EX_NODE_SET,
126  nodeset_ids[id],
127  &num_nodes_per_set[id],
128  &num_node_df_per_set[id]);
129  EX_CHECK_ERR(ex_err, "Error retrieving nodeset parameters.");
130  message("Parameters retrieved successfully for nodeset: ", id);
131 
132  node_list.resize(num_nodes_per_set[id]);
133 
134  // Don't call ex_get_set unless there are actually nodes there to get.
135  // Exodus prints an annoying warning message in DEBUG mode otherwise...
136  if (num_nodes_per_set[id] > 0)
137  {
138  ex_err = exII::ex_get_set(ex_id,
139  exII::EX_NODE_SET,
140  nodeset_ids[id],
141  node_list.data(),
142  nullptr); // set_extra_list, ignored for node sets
143 
144  EX_CHECK_ERR(ex_err, "Error retrieving nodeset data.");
145  message("Data retrieved successfully for nodeset: ", id);
146  }
147 }
std::vector< int > node_list
void message(std::string_view msg)
Prints the message defined in msg.
std::vector< int > num_node_df_per_set
std::vector< int > num_nodes_per_set

◆ read_nodeset_data()

void libMesh::ExodusII_IO_Helper::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 
)
inherited

Read nodeset variables, if any, into the provided data structures.

Definition at line 4354 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::node_sets_node_list, libMesh::ExodusII_IO_Helper::NODESET, libMesh::ExodusII_IO_Helper::nodeset_ids, libMesh::ExodusII_IO_Helper::nodeset_var_names, libMesh::ExodusII_IO_Helper::num_node_sets, libMesh::ExodusII_IO_Helper::num_nodes_per_set, libMesh::ExodusII_IO_Helper::num_nodeset_vars, and libMesh::ExodusII_IO_Helper::read_var_names().

4358 {
4359  LOG_SCOPE("read_nodeset_data()", "ExodusII_IO_Helper");
4360 
4361  // This reads the sideset variable names into the local
4362  // sideset_var_names data structure.
4363  this->read_var_names(NODESET);
4364 
4365  if (num_nodeset_vars)
4366  {
4367  // Read the nodeset data truth table
4368  std::vector<int> nset_var_tab(num_node_sets * num_nodeset_vars);
4369  ex_err = exII::ex_get_truth_table
4370  (ex_id,
4371  exII::EX_NODE_SET,
4372  num_node_sets,
4374  nset_var_tab.data());
4375  EX_CHECK_ERR(ex_err, "Error reading nodeset variable truth table.");
4376 
4377  // Set up/allocate space in incoming data structures.
4378  var_names = nodeset_var_names;
4379  node_boundary_ids.resize(num_nodeset_vars);
4380  bc_vals.resize(num_nodeset_vars);
4381 
4382  // Read the nodeset data.
4383  //
4384  // Note: we assume that the functions
4385  // 1.) this->read_nodeset_info() and
4386  // 2.) this->read_all_nodesets()
4387  // have already been called, so that we already know e.g. how
4388  // many nodes are in each set, their ids, etc.
4389  //
4390  // TODO: As a future optimization, we could read only the values
4391  // requested by the user by looking at the input parameter
4392  // var_names and checking whether it already has entries in
4393  // it.
4394  int offset=0;
4395  for (int ns=0; ns<num_node_sets; ++ns)
4396  {
4397  offset += (ns > 0 ? num_nodes_per_set[ns-1] : 0);
4398  for (int var=0; var<num_nodeset_vars; ++var)
4399  {
4400  int is_present = nset_var_tab[num_nodeset_vars*ns + var];
4401 
4402  if (is_present)
4403  {
4404  // Record the fact that this variable is defined on this nodeset.
4405  node_boundary_ids[var].insert(nodeset_ids[ns]);
4406 
4407  // Note: the assumption here is that a previous call
4408  // to this->read_nodeset_info() has already set the
4409  // values of num_nodes_per_set, so we just use those values here.
4410  std::vector<Real> nset_var_vals(num_nodes_per_set[ns]);
4411  ex_err = exII::ex_get_var
4412  (ex_id,
4413  timestep,
4414  exII::EX_NODE_SET,
4415  var + 1, // 1-based nodeset variable index!
4416  nodeset_ids[ns],
4417  num_nodes_per_set[ns],
4418  MappedInputVector(nset_var_vals, _single_precision).data());
4419  EX_CHECK_ERR(ex_err, "Error reading nodeset variable.");
4420 
4421  for (int i=0; i<num_nodes_per_set[ns]; ++i)
4422  {
4423  // The read_all_nodesets() function now reads all the node ids into the
4424  // node_sets_node_list vector, which is of length "total_nodes_in_all_sets"
4425  // The old read_nodset() function is no longer called as far as I can tell,
4426  // and should probably be removed? The "offset" that we are using only
4427  // depends on the current nodeset index and the num_nodes_per_set vector,
4428  // which gets filled in by the call to read_all_nodesets().
4429  dof_id_type exodus_node_id = node_sets_node_list[i + offset];
4430 
4431  // FIXME: We should use exodus_node_num_to_libmesh for this,
4432  // but it apparently is never set up, so just
4433  // subtract 1 from the Exodus node id.
4434  dof_id_type converted_node_id = exodus_node_id - 1;
4435 
4436  // Make a NodeBCTuple key from the converted information.
4437  BoundaryInfo::NodeBCTuple key = std::make_tuple
4438  (converted_node_id, nodeset_ids[ns]);
4439 
4440  // Store (node, b_id) tuples in bc_vals[var]
4441  bc_vals[var].emplace(key, nset_var_vals[i]);
4442  } // end for (i)
4443  } // end if (present)
4444  } // end for (var)
4445  } // end for (ns)
4446  } // end if (num_nodeset_vars)
4447 }
std::vector< std::string > nodeset_var_names
std::tuple< dof_id_type, boundary_id_type > NodeBCTuple
Create a list of (node_id, boundary_id) tuples for all relevant nodes.
void read_var_names(ExodusVarType type)
std::vector< int > node_sets_node_list
std::vector< int > num_nodes_per_set
uint8_t dof_id_type
Definition: id_types.h:67

◆ read_nodeset_info()

void libMesh::ExodusII_IO_Helper::read_nodeset_info ( )
inherited

Reads information about all of the nodesets in the ExodusII mesh file.

Definition at line 1576 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::id_to_ns_names, libMesh::ExodusII_IO_Helper::message(), libMesh::ExodusII_IO_Helper::nodeset_ids, libMesh::ExodusII_IO_Helper::num_node_df_per_set, libMesh::ExodusII_IO_Helper::num_node_sets, and libMesh::ExodusII_IO_Helper::num_nodes_per_set.

1577 {
1578  nodeset_ids.resize(num_node_sets);
1579  if (num_node_sets > 0)
1580  {
1581  ex_err = exII::ex_get_ids(ex_id,
1582  exII::EX_NODE_SET,
1583  nodeset_ids.data());
1584  EX_CHECK_ERR(ex_err, "Error retrieving nodeset information.");
1585  message("All nodeset information retrieved successfully.");
1586 
1587  // Resize appropriate data structures -- only do this once outside the loop
1590  }
1591 
1592  char name_buffer[libmesh_max_str_length+1];
1593  for (int i=0; i<num_node_sets; ++i)
1594  {
1595  ex_err = exII::ex_get_name(ex_id, exII::EX_NODE_SET,
1596  nodeset_ids[i], name_buffer);
1597  EX_CHECK_ERR(ex_err, "Error getting node set name.");
1598  id_to_ns_names[nodeset_ids[i]] = name_buffer;
1599  }
1600  message("All node set names retrieved successfully.");
1601 }
void message(std::string_view msg)
Prints the message defined in msg.
std::vector< int > num_node_df_per_set
std::map< int, std::string > id_to_ns_names
std::vector< int > num_nodes_per_set

◆ read_num_time_steps()

void libMesh::ExodusII_IO_Helper::read_num_time_steps ( )
inherited

Reads the number of timesteps currently stored in the Exodus file and stores it in the num_time_steps variable.

Definition at line 1863 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::num_time_steps.

Referenced by libMesh::ExodusII_IO_Helper::read_and_store_header_info(), and libMesh::ExodusII_IO_Helper::read_time_steps().

1864 {
1865  num_time_steps =
1866  inquire(*this, exII::EX_INQ_TIME, "Error retrieving number of time steps");
1867 }

◆ read_qa_records()

void libMesh::ExodusII_IO_Helper::read_qa_records ( )
inherited

Reads the QA records from an ExodusII file.

We can use this to detect when e.g. CUBIT 14+ was used to generate a Mesh file, and work around certain known bugs in that version.

Definition at line 800 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::make_range(), libMesh::out, and libMesh::ExodusII_IO_Helper::verbose.

801 {
802  // The QA records are four MAX_STR_LENGTH-byte character strings.
803  int num_qa_rec =
804  inquire(*this, exII::EX_INQ_QA, "Error retrieving number of QA records");
805 
806  if (verbose)
807  libMesh::out << "Found "
808  << num_qa_rec
809  << " QA record(s) in the Exodus file."
810  << std::endl;
811 
812  if (num_qa_rec > 0)
813  {
814  // Actual (num_qa_rec x 4) storage for strings. The object we
815  // pass to the Exodus API will just contain pointers into the
816  // qa_storage object, which will have all automatic memory
817  // management.
818  std::vector<std::vector<std::vector<char>>> qa_storage(num_qa_rec);
819  for (auto i : make_range(num_qa_rec))
820  {
821  qa_storage[i].resize(4);
822  for (auto j : make_range(4))
823  qa_storage[i][j].resize(libmesh_max_str_length+1);
824  }
825 
826  // inner_array_t is a fixed-size array of 4 strings
827  typedef char * inner_array_t[4];
828 
829  // There is at least one compiler (Clang 12.0.1) that complains about
830  // "a non-scalar type used in a pseudo-destructor expression" when
831  // we try to instantiate a std::vector of inner_array_t objects as in:
832  // std::vector<inner_array_t> qa_record(num_qa_rec);
833  // So, we instead attempt to achieve the same effect with a std::unique_ptr.
834  auto qa_record = std::make_unique<inner_array_t[]>(num_qa_rec);
835 
836  // Create data structure to be passed to Exodus API by setting
837  // pointers to the actual strings which are in qa_storage.
838  for (auto i : make_range(num_qa_rec))
839  for (auto j : make_range(4))
840  qa_record[i][j] = qa_storage[i][j].data();
841 
842  ex_err = exII::ex_get_qa (ex_id, qa_record.get());
843  EX_CHECK_ERR(ex_err, "Error reading the QA records.");
844 
845  // Print the QA records
846  if (verbose)
847  {
848  for (auto i : make_range(num_qa_rec))
849  {
850  libMesh::out << "QA Record: " << i << std::endl;
851  for (auto j : make_range(4))
852  libMesh::out << qa_record[i][j] << std::endl;
853  }
854  }
855  }
856 }
OStreamProxy out
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176

◆ read_sideset()

void libMesh::ExodusII_IO_Helper::read_sideset ( int  id,
int  offset 
)
inherited

Reads information about sideset id and inserts it into the global sideset array at the position offset.

Definition at line 1645 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::elem_list, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::id_list, libMesh::ExodusII_IO_Helper::message(), libMesh::ExodusII_IO_Helper::num_df_per_set, libMesh::ExodusII_IO_Helper::num_sides_per_set, libMesh::ExodusII_IO_Helper::side_list, and libMesh::ExodusII_IO_Helper::ss_ids.

Referenced by libMesh::ExodusII_IO_Helper::write_sideset_data().

1646 {
1647  LOG_SCOPE("read_sideset()", "ExodusII_IO_Helper");
1648 
1649  libmesh_assert_less (id, ss_ids.size());
1650  libmesh_assert_less (id, num_sides_per_set.size());
1651  libmesh_assert_less (id, num_df_per_set.size());
1652  libmesh_assert_less_equal (offset, elem_list.size());
1653  libmesh_assert_less_equal (offset, side_list.size());
1654 
1655  ex_err = exII::ex_get_set_param(ex_id,
1656  exII::EX_SIDE_SET,
1657  ss_ids[id],
1658  &num_sides_per_set[id],
1659  &num_df_per_set[id]);
1660  EX_CHECK_ERR(ex_err, "Error retrieving sideset parameters.");
1661  message("Parameters retrieved successfully for sideset: ", id);
1662 
1663 
1664  // It's OK for offset==elem_list.size() as long as num_sides_per_set[id]==0
1665  // because in that case we don't actually read anything...
1666 #ifdef DEBUG
1667  if (static_cast<unsigned int>(offset) == elem_list.size() ||
1668  static_cast<unsigned int>(offset) == side_list.size() )
1669  libmesh_assert_equal_to (num_sides_per_set[id], 0);
1670 #endif
1671 
1672 
1673  // Don't call ex_get_set unless there are actually sides there to get.
1674  // Exodus prints an annoying warning in DEBUG mode otherwise...
1675  if (num_sides_per_set[id] > 0)
1676  {
1677  ex_err = exII::ex_get_set(ex_id,
1678  exII::EX_SIDE_SET,
1679  ss_ids[id],
1680  &elem_list[offset],
1681  &side_list[offset]);
1682  EX_CHECK_ERR(ex_err, "Error retrieving sideset data.");
1683  message("Data retrieved successfully for sideset: ", id);
1684 
1685  for (int i=0; i<num_sides_per_set[id]; i++)
1686  id_list[i+offset] = ss_ids[id];
1687  }
1688 }
std::vector< int > num_sides_per_set
void message(std::string_view msg)
Prints the message defined in msg.
std::vector< int > num_df_per_set

◆ read_sideset_data()

void libMesh::ExodusII_IO_Helper::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 
)
inherited

Read sideset variables, if any, into the provided data structures.

Definition at line 3822 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::elem_list, libMesh::MeshBase::elem_ptr(), libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::get_conversion(), libMesh::ExodusII_IO_Helper::Conversion::get_side_map(), mesh, libMesh::ExodusII_IO_Helper::num_side_sets, libMesh::ExodusII_IO_Helper::num_sides_per_set, libMesh::ExodusII_IO_Helper::num_sideset_vars, libMesh::ExodusII_IO_Helper::read_var_names(), libMesh::ExodusII_IO_Helper::side_list, libMesh::ExodusII_IO_Helper::SIDESET, libMesh::ExodusII_IO_Helper::sideset_var_names, libMesh::ExodusII_IO_Helper::ss_ids, and libMesh::Elem::type().

3827 {
3828  LOG_SCOPE("read_sideset_data()", "ExodusII_IO_Helper");
3829 
3830  // This reads the sideset variable names into the local
3831  // sideset_var_names data structure.
3832  this->read_var_names(SIDESET);
3833 
3834  if (num_sideset_vars)
3835  {
3836  // Read the sideset data truth table
3837  std::vector<int> sset_var_tab(num_side_sets * num_sideset_vars);
3838  ex_err = exII::ex_get_truth_table
3839  (ex_id,
3840  exII::EX_SIDE_SET,
3841  num_side_sets,
3843  sset_var_tab.data());
3844  EX_CHECK_ERR(ex_err, "Error reading sideset variable truth table.");
3845 
3846  // Set up/allocate space in incoming data structures.
3847  var_names = sideset_var_names;
3848  side_ids.resize(num_sideset_vars);
3849  bc_vals.resize(num_sideset_vars);
3850 
3851  // Read the sideset data.
3852  //
3853  // Note: we assume that read_sideset() has already been called
3854  // for each sideset, so the required values in elem_list and
3855  // side_list are already present.
3856  //
3857  // TODO: As a future optimization, we could read only the values
3858  // requested by the user by looking at the input parameter
3859  // var_names and checking whether it already has entries in
3860  // it. We could do the same thing with the input side_ids
3861  // container and only read values for requested sidesets.
3862  int offset=0;
3863  for (int ss=0; ss<num_side_sets; ++ss)
3864  {
3865  offset += (ss > 0 ? num_sides_per_set[ss-1] : 0);
3866  for (int var=0; var<num_sideset_vars; ++var)
3867  {
3868  int is_present = sset_var_tab[num_sideset_vars*ss + var];
3869 
3870  if (is_present)
3871  {
3872  // Record the fact that this variable is defined on this sideset.
3873  side_ids[var].insert(ss_ids[ss]);
3874 
3875  // Note: the assumption here is that a previous call
3876  // to this->read_sideset_info() has already set the
3877  // values of num_sides_per_set, so we just use those values here.
3878  std::vector<Real> sset_var_vals(num_sides_per_set[ss]);
3879  ex_err = exII::ex_get_var
3880  (ex_id,
3881  timestep,
3882  exII::EX_SIDE_SET,
3883  var + 1, // 1-based sideset variable index!
3884  ss_ids[ss],
3885  num_sides_per_set[ss],
3886  MappedInputVector(sset_var_vals, _single_precision).data());
3887  EX_CHECK_ERR(ex_err, "Error reading sideset variable.");
3888 
3889  for (int i=0; i<num_sides_per_set[ss]; ++i)
3890  {
3891  dof_id_type exodus_elem_id = elem_list[i + offset];
3892  unsigned int exodus_side_id = side_list[i + offset];
3893 
3894  // FIXME: We should use exodus_elem_num_to_libmesh for this,
3895  // but it apparently is never set up, so just
3896  // subtract 1 from the Exodus elem id.
3897  dof_id_type converted_elem_id = exodus_elem_id - 1;
3898 
3899  // Map Exodus side id to libmesh side id.
3900  // Map from Exodus side ids to libmesh side ids.
3901  const auto & conv = get_conversion(mesh.elem_ptr(converted_elem_id)->type());
3902 
3903  // Map from Exodus side id to libmesh side id.
3904  // Note: the mapping is defined on 0-based indices, so subtract
3905  // 1 before doing the mapping.
3906  unsigned int converted_side_id = conv.get_side_map(exodus_side_id - 1);
3907 
3908  // Make a BCTuple key from the converted information.
3909  BoundaryInfo::BCTuple key = std::make_tuple
3910  (converted_elem_id,
3911  converted_side_id,
3912  ss_ids[ss]);
3913 
3914  // Store (elem, side, b_id) tuples in bc_vals[var]
3915  bc_vals[var].emplace(key, sset_var_vals[i]);
3916  } // end for (i)
3917  } // end if (present)
3918  } // end for (var)
3919  } // end for (ss)
3920  } // end if (num_sideset_vars)
3921 }
std::tuple< dof_id_type, unsigned short int, boundary_id_type > BCTuple
Create a list of (element_id, side_id, boundary_id) tuples for relevant sides.
std::vector< std::string > sideset_var_names
std::vector< int > num_sides_per_set
MeshBase & mesh
const ExodusII_IO_Helper::Conversion & get_conversion(const ElemType type) const
void read_var_names(ExodusVarType type)
virtual const Elem * elem_ptr(const dof_id_type i) const =0
virtual ElemType type() const =0
uint8_t dof_id_type
Definition: id_types.h:67

◆ read_sideset_info()

void libMesh::ExodusII_IO_Helper::read_sideset_info ( )
inherited

Reads information about all of the sidesets in the ExodusII mesh file.

Definition at line 1541 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::elem_list, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::id_list, libMesh::ExodusII_IO_Helper::id_to_ss_names, libMesh::ExodusII_IO_Helper::message(), libMesh::ExodusII_IO_Helper::num_df_per_set, libMesh::ExodusII_IO_Helper::num_elem_all_sidesets, libMesh::ExodusII_IO_Helper::num_side_sets, libMesh::ExodusII_IO_Helper::num_sides_per_set, libMesh::ExodusII_IO_Helper::side_list, and libMesh::ExodusII_IO_Helper::ss_ids.

Referenced by libMesh::ExodusII_IO_Helper::write_sideset_data().

1542 {
1543  ss_ids.resize(num_side_sets);
1544  if (num_side_sets > 0)
1545  {
1546  ex_err = exII::ex_get_ids(ex_id,
1547  exII::EX_SIDE_SET,
1548  ss_ids.data());
1549  EX_CHECK_ERR(ex_err, "Error retrieving sideset information.");
1550  message("All sideset information retrieved successfully.");
1551 
1552  // Resize appropriate data structures -- only do this once outside the loop
1554  num_df_per_set.resize(num_side_sets);
1555 
1556  // Inquire about the length of the concatenated side sets element list
1557  num_elem_all_sidesets = inquire(*this, exII::EX_INQ_SS_ELEM_LEN, "Error retrieving length of the concatenated side sets element list!");
1558 
1561  id_list.resize (num_elem_all_sidesets);
1562  }
1563 
1564  char name_buffer[libmesh_max_str_length+1];
1565  for (int i=0; i<num_side_sets; ++i)
1566  {
1567  ex_err = exII::ex_get_name(ex_id, exII::EX_SIDE_SET,
1568  ss_ids[i], name_buffer);
1569  EX_CHECK_ERR(ex_err, "Error getting side set name.");
1570  id_to_ss_names[ss_ids[i]] = name_buffer;
1571  }
1572  message("All side set names retrieved successfully.");
1573 }
std::vector< int > num_sides_per_set
std::map< int, std::string > id_to_ss_names
void message(std::string_view msg)
Prints the message defined in msg.
std::vector< int > num_df_per_set

◆ read_time_steps()

void libMesh::ExodusII_IO_Helper::read_time_steps ( )
inherited

Reads and stores the timesteps in the 'time_steps' array.

Definition at line 1846 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::num_time_steps, libMesh::ExodusII_IO_Helper::read_num_time_steps(), and libMesh::ExodusII_IO_Helper::time_steps.

1847 {
1848  // Make sure we have an up-to-date count of the number of time steps in the file.
1849  this->read_num_time_steps();
1850 
1851  if (num_time_steps > 0)
1852  {
1853  time_steps.resize(num_time_steps);
1854  ex_err = exII::ex_get_all_times
1855  (ex_id,
1856  MappedInputVector(time_steps, _single_precision).data());
1857  EX_CHECK_ERR(ex_err, "Error reading timesteps!");
1858  }
1859 }
std::vector< Real > time_steps
void read_num_time_steps()
Reads the number of timesteps currently stored in the Exodus file and stores it in the num_time_steps...

◆ read_var_names()

void libMesh::ExodusII_IO_Helper::read_var_names ( ExodusVarType  type)
inherited

Definition at line 1935 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::elem_var_names, libMesh::ExodusII_IO_Helper::ELEMENTAL, libMesh::ExodusII_IO_Helper::ELEMSET, libMesh::ExodusII_IO_Helper::elemset_var_names, libMesh::ExodusII_IO_Helper::GLOBAL, libMesh::ExodusII_IO_Helper::global_var_names, libMesh::ExodusII_IO_Helper::NODAL, libMesh::ExodusII_IO_Helper::nodal_var_names, libMesh::ExodusII_IO_Helper::NODESET, libMesh::ExodusII_IO_Helper::nodeset_var_names, libMesh::ExodusII_IO_Helper::num_elem_vars, libMesh::ExodusII_IO_Helper::num_elemset_vars, libMesh::ExodusII_IO_Helper::num_global_vars, libMesh::ExodusII_IO_Helper::num_nodal_vars, libMesh::ExodusII_IO_Helper::num_nodeset_vars, libMesh::ExodusII_IO_Helper::num_sideset_vars, libMesh::ExodusII_IO_Helper::read_var_names_impl(), libMesh::ExodusII_IO_Helper::SIDESET, and libMesh::ExodusII_IO_Helper::sideset_var_names.

Referenced by libMesh::ExodusII_IO_Helper::check_existing_vars(), libMesh::ExodusII_IO_Helper::read_elemental_var_values(), libMesh::ExodusII_IO_Helper::read_elemset_data(), libMesh::ExodusII_IO_Helper::read_nodal_var_values(), libMesh::ExodusII_IO_Helper::read_nodeset_data(), and libMesh::ExodusII_IO_Helper::read_sideset_data().

1936 {
1937  switch (type)
1938  {
1939  case NODAL:
1941  break;
1942  case ELEMENTAL:
1944  break;
1945  case GLOBAL:
1947  break;
1948  case SIDESET:
1950  break;
1951  case NODESET:
1953  break;
1954  case ELEMSET:
1956  break;
1957  default:
1958  libmesh_error_msg("Unrecognized ExodusVarType " << type);
1959  }
1960 }
std::vector< std::string > sideset_var_names
std::vector< std::string > elem_var_names
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< std::string > nodeset_var_names
std::vector< std::string > global_var_names
std::vector< std::string > elemset_var_names
std::vector< std::string > nodal_var_names

◆ read_var_names_impl()

void libMesh::Nemesis_IO_Helper::read_var_names_impl ( const char *  var_type,
int count,
std::vector< std::string > &  result 
)
overrideprotectedvirtual

read_var_names() dispatches to this function.

We need to override it slightly for Nemesis.

Reimplemented from libMesh::ExodusII_IO_Helper.

Definition at line 2761 of file nemesis_io_helper.C.

References TIMPI::Communicator::broadcast(), libMesh::ParallelObject::comm(), libMesh::DofObject::invalid_processor_id, libMesh::libmesh_assert(), TIMPI::Communicator::min(), libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::read_var_names_impl().

2764 {
2765  // Most of what we need to do is the same as for Exodus
2766  this->ExodusII_IO_Helper::read_var_names_impl(var_type, count, result);
2767 
2768  // But with tests where we have more processors than elements,
2769  // Nemesis doesn't let us put variable names in files written by
2770  // processors owning nothing, but we may still *need* those
2771  // variable names on every processor, so let's sync them up...
2772 
2773  processor_id_type pid_broadcasting_names = this->processor_id();
2774  const std::size_t n_names = result.size();
2775  if (!n_names)
2776  pid_broadcasting_names = DofObject::invalid_processor_id;
2777 
2778  libmesh_assert(this->comm().semiverify
2779  (n_names ? nullptr : &n_names));
2780 
2781  this->comm().min(pid_broadcasting_names);
2782 
2783  if (pid_broadcasting_names != DofObject::invalid_processor_id)
2784  this->comm().broadcast(result, pid_broadcasting_names);
2785 }
static constexpr processor_id_type invalid_processor_id
An invalid processor_id to distinguish DoFs that have not been assigned to a processor.
Definition: dof_object.h:484
virtual void read_var_names_impl(const char *var_type, int &count, std::vector< std::string > &result)
read_var_names() dispatches to this function.
const Parallel::Communicator & comm() const
uint8_t processor_id_type
void min(const T &r, T &o, Request &req) const
libmesh_assert(ctx)
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
processor_id_type processor_id() const

◆ set_add_sides()

void libMesh::ExodusII_IO_Helper::set_add_sides ( bool  add_sides)
inlineinherited

Sets whether or not to write extra "side" elements.

This is useful for plotting SIDE_DISCONTINUOUS data.

Definition at line 1341 of file exodusII_io_helper.h.

References libMesh::ExodusII_IO_Helper::_add_sides.

1342 {
1343  _add_sides = add_sides;
1344 }
bool _add_sides
Set to true iff we want to write separate "side" elements too.

◆ set_coordinate_offset()

void libMesh::ExodusII_IO_Helper::set_coordinate_offset ( Point  p)
inherited

Allows you to set a vector that is added to the coordinates of all of the nodes.

Effectively, this "moves" the mesh to a particular position

Definition at line 4872 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_coordinate_offset.

4873 {
4874  _coordinate_offset = p;
4875 }

◆ set_hdf5_writing()

void libMesh::ExodusII_IO_Helper::set_hdf5_writing ( bool  write_hdf5)
inherited

Set to true (the default) to write files in an HDF5-based file format (when HDF5 is available), or to false to write files in the old NetCDF3-based format.

If HDF5 is unavailable, this setting does nothing.

Definition at line 4845 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_write_hdf5.

4846 {
4847  _write_hdf5 = write_hdf5;
4848 }

◆ set_max_name_length()

void libMesh::ExodusII_IO_Helper::set_max_name_length ( unsigned int  max_length)
inherited

Set how many characters to use in names when opening a file for writing.

Definition at line 4851 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_max_name_length, libMesh::libmesh_assert(), and libMesh::ExodusII_IO_Helper::opened_for_writing.

4852 {
4853  // Opt mode error, because this may be exposed to users
4854  libmesh_error_msg_if (max_length > libmesh_max_str_length,
4855  "Exodus maximum name length is limited to " <<
4856  libmesh_max_str_length << " characters");
4857 
4858  // Devel+dbg mode assertion, because developers should do better
4860 
4861  _max_name_length = max_length;
4862 }
libmesh_assert(ctx)

◆ update()

void libMesh::ExodusII_IO_Helper::update ( )
inherited

◆ use_mesh_dimension_instead_of_spatial_dimension()

void libMesh::ExodusII_IO_Helper::use_mesh_dimension_instead_of_spatial_dimension ( bool  val)
inherited

Sets the underlying value of the boolean flag _use_mesh_dimension_instead_of_spatial_dimension.

By default, the value of this flag is false.

See the ExodusII_IO class documentation for a detailed description of this flag.

Definition at line 4839 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_use_mesh_dimension_instead_of_spatial_dimension.

◆ write_as_dimension()

void libMesh::ExodusII_IO_Helper::write_as_dimension ( unsigned  dim)
inherited

Sets the value of _write_as_dimension.

This directly controls the num_dim which is written to the Exodus file. If non-zero, this value supersedes all other dimensions, including: 1.) MeshBase::spatial_dimension() 2.) MeshBase::mesh_dimension() 3.) Any value passed to use_mesh_dimension_instead_of_spatial_dimension() This is useful/necessary for working around a bug in Paraview which prevents the "Plot Over Line" filter from working on 1D meshes.

Definition at line 4865 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_write_as_dimension, and dim.

4866 {
4868 }
unsigned int dim

◆ write_complex_magnitude()

void libMesh::Nemesis_IO_Helper::write_complex_magnitude ( bool  val)

Set the flag indicating whether the complex modulus should be written when complex numbers are enabled.

By default this flag is set to true.

◆ write_element_values() [1/2]

void libMesh::Nemesis_IO_Helper::write_element_values ( const MeshBase mesh,
const EquationSystems es,
const std::vector< std::pair< unsigned int, unsigned int >> &  var_nums,
int  timestep,
const std::vector< std::set< subdomain_id_type >> &  vars_active_subdomains 
)

Writes the vector of elemental variable values, one variable and one subdomain at a time.

Definition at line 2630 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::_single_precision, libMesh::CONSTANT, libMesh::System::current_local_solution, libMesh::ExodusII_IO_Helper::MappedOutputVector::data(), libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::EquationSystems::get_system(), global_elem_blk_ids, libMesh::if(), libMesh::index_range(), mesh, libMesh::MONOMIAL_VEC, subdomain_map, libMesh::ExodusII_IO_Helper::update(), libMesh::System::variable_type(), and write_complex_abs.

2635 {
2636  // For each variable in names,
2637  // For each subdomain in subdomain_map,
2638  // If this (subdomain, variable) combination is active
2639  // For each component in variable
2640  // Extract element values into local_soln (localize is a collective)
2641  // Write local_soln to file
2642  // Update var_ctr with number of vector components for variable
2643  //
2644  unsigned int var_ctr = 0;
2645  for (auto v : index_range(var_nums))
2646  {
2647  const unsigned int sys_num = var_nums[v].first;
2648  const unsigned int var = var_nums[v].second;
2649  const System & system = es.get_system(sys_num);
2650 
2651  // We need to check if the constant monomial is a scalar or a vector and set the number of
2652  // components as the mesh spatial dimension for the latter as per es.find_variable_numbers().
2653  // Even for the case where a variable is not active on any subdomain belonging to the
2654  // processor, we still need to know this number to update 'var_ctr'.
2655  const unsigned int n_comps =
2656  (system.variable_type(var) == FEType(CONSTANT, MONOMIAL_VEC)) ? mesh.spatial_dimension() : 1;
2657 
2658  // Get list of active subdomains for variable v
2659  const auto & active_subdomains = vars_active_subdomains[v];
2660 
2661  for (const int sbd_id_int : global_elem_blk_ids)
2662  {
2663  const subdomain_id_type sbd_id =
2664  restrict_int<subdomain_id_type>(sbd_id_int);
2665  auto it = subdomain_map.find(sbd_id);
2666  const std::vector<dof_id_type> empty_vec;
2667  const std::vector<dof_id_type> & elem_ids =
2668  (it == subdomain_map.end()) ? empty_vec : it->second;
2669 
2670  // Possibly skip this (variable, subdomain) combination. Also, check that there is at
2671  // least one element on the subdomain... Indeed, it is possible to have zero elements,
2672  // e.g., when running "adaptivity_ex3" in parallel with the 'dimension=1' argument.
2673  if ((active_subdomains.empty() || active_subdomains.count(sbd_id)) && elem_ids.size())
2674  {
2675  std::vector<numeric_index_type> required_indices;
2676  required_indices.reserve(elem_ids.size());
2677 
2678  // The number of DOF components needs to be equal to the expected number so that we
2679  // know where to store data to correctly correspond to variable names - verify this by
2680  // accessing the n_comp method for the last element ID, which should return the same
2681  // value for all elements on a given subdomain, so we only need to check this once.
2682  libmesh_assert_equal_to(n_comps, mesh.elem_ref(elem_ids.back()).n_comp(sys_num, var));
2683 
2684  // Loop through the DOFs of the variable and write the values for it on each element.
2685  // The variable name should have been decomposed by es.find_variable_numbers().
2686  for (unsigned int comp = 0; comp < n_comps; ++comp)
2687  {
2688  for (const auto & id : elem_ids)
2689  required_indices.push_back(mesh.elem_ref(id).dof_number(sys_num, var, comp));
2690 
2691  std::vector<Number> local_soln;
2692  system.current_local_solution->get(required_indices, local_soln);
2693 
2694  // reset for the next component
2695  required_indices.clear();
2696 
2697  // It's possible that there's nothing for us to write:
2698  // we may not be responsible for any elements on the
2699  // current subdomain. We did still have to participate
2700  // in the localize() call above, however, since it is a
2701  // collective.
2702  if (local_soln.size())
2703  {
2704 #ifdef LIBMESH_USE_COMPLEX_NUMBERS
2705  int stride = write_complex_abs ? 3 : 2;
2706  std::vector<Real> local_soln_buffer(local_soln.size());
2707  std::transform(local_soln.begin(), local_soln.end(),
2708  local_soln_buffer.begin(), [](Number n) { return n.real(); });
2709  ex_err = exII::ex_put_elem_var(ex_id,
2710  timestep,
2711  static_cast<int>(stride*(var_ctr+comp)+1),
2712  static_cast<int>(sbd_id),
2713  static_cast<int>(local_soln.size()),
2714  MappedOutputVector(local_soln_buffer, _single_precision).data());
2715  EX_CHECK_ERR(ex_err, "Error writing element real values.");
2716 
2717  std::transform(local_soln.begin(), local_soln.end(),
2718  local_soln_buffer.begin(), [](Number n) { return n.imag(); });
2719  ex_err = exII::ex_put_elem_var(ex_id,
2720  timestep,
2721  static_cast<int>(stride*(var_ctr+comp)+2),
2722  static_cast<int>(sbd_id),
2723  static_cast<int>(local_soln.size()),
2724  MappedOutputVector(local_soln_buffer, _single_precision).data());
2725  EX_CHECK_ERR(ex_err, "Error writing element imaginary values.");
2726 
2727  if (write_complex_abs)
2728  {
2729  std::transform(local_soln.begin(), local_soln.end(),
2730  local_soln_buffer.begin(), [](Number n) { return std::abs(n); });
2731  ex_err = exII::ex_put_elem_var(ex_id,
2732  timestep,
2733  static_cast<int>(stride*(var_ctr+comp)+2),
2734  static_cast<int>(sbd_id),
2735  static_cast<int>(local_soln.size()),
2736  MappedOutputVector(local_soln_buffer, _single_precision).data());
2737  EX_CHECK_ERR(ex_err, "Error writing element magnitudes.");
2738  }
2739 #else // LIBMESH_USE_COMPLEX_NUMBERS
2740  ex_err = exII::ex_put_elem_var(ex_id,
2741  timestep,
2742  static_cast<int>(var_ctr+comp+1),
2743  static_cast<int>(sbd_id),
2744  static_cast<int>(local_soln.size()),
2745  MappedOutputVector(local_soln, _single_precision).data());
2746  EX_CHECK_ERR(ex_err, "Error writing element values.");
2747 #endif // LIBMESH_USE_COMPLEX_NUMBERS
2748  }
2749  } // end loop over vector components
2750  }
2751  } // end loop over active subdomains
2752 
2753  var_ctr += n_comps;
2754  } // end loop over vars
2755 
2756  this->update();
2757 }
std::map< subdomain_id_type, std::vector< dof_id_type > > subdomain_map
Map of subdomains to element numbers.
TestClass subdomain_id_type
Based on the 4-byte comment warning above, this probably doesn&#39;t work with exodusII at all...
Definition: id_types.h:43
MeshBase & mesh
bool write_complex_abs
By default, when complex numbers are enabled, for each variable we write out three values: the real p...
void update()
Uses ex_update() to flush buffers to file.
std::vector< int > global_elem_blk_ids
Read the global element block IDs and counts.
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153

◆ write_element_values() [2/2]

void libMesh::ExodusII_IO_Helper::write_element_values ( const MeshBase mesh,
const std::vector< Real > &  values,
int  timestep,
const std::vector< std::set< subdomain_id_type >> &  vars_active_subdomains 
)
inherited

Writes the vector of values to the element variables.

The 'values' vector is assumed to be in the order: {(u1, u2, u3, ..., uN), (v1, v2, v3, ..., vN), (w1, w2, w3, ..., wN)} where N is the number of elements.

This ordering is produced by calls to ES::build_elemental_solution_vector(). ES::build_discontinuous_solution_vector(), on the other hand, produces an element-major ordering. See the function below for that case.

Definition at line 4498 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_run_only_on_proc0, libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::get_block_id(), mesh, libMesh::MeshTools::n_elem(), libMesh::MeshBase::n_elem(), libMesh::ExodusII_IO_Helper::num_elem_vars, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::update().

4502 {
4503  LOG_SCOPE("write_element_values()", "ExodusII_IO_Helper");
4504 
4505  if ((_run_only_on_proc0) && (this->processor_id() != 0))
4506  return;
4507 
4508  // Ask the file how many element vars it has, store it in the num_elem_vars variable.
4509  ex_err = exII::ex_get_variable_param(ex_id, exII::EX_ELEM_BLOCK, &num_elem_vars);
4510  EX_CHECK_ERR(ex_err, "Error reading number of elemental variables.");
4511 
4512  // We will eventually loop over the element blocks (subdomains) and
4513  // write the data one block at a time. Build a data structure that
4514  // maps each subdomain to a list of element ids it contains.
4515  std::map<subdomain_id_type, std::vector<unsigned int>> subdomain_map;
4516  for (const auto & elem : mesh.active_element_ptr_range())
4517  subdomain_map[elem->subdomain_id()].push_back(elem->id());
4518 
4519  // Use mesh.n_elem() to access into the values vector rather than
4520  // the number of elements the Exodus writer thinks the mesh has,
4521  // which may not include inactive elements.
4523 
4524  // Sanity check: we must have an entry in vars_active_subdomains for
4525  // each variable that we are potentially writing out.
4526  libmesh_assert_equal_to
4527  (vars_active_subdomains.size(),
4528  static_cast<unsigned>(num_elem_vars));
4529 
4530  // For each variable, create a 'data' array which holds all the elemental variable
4531  // values *for a given block* on this processor, then write that data vector to file
4532  // before moving onto the next block.
4533  for (unsigned int var_id=0; var_id<static_cast<unsigned>(num_elem_vars); ++var_id)
4534  {
4535  // The size of the subdomain map is the number of blocks.
4536  auto it = subdomain_map.begin();
4537 
4538  // Reference to the set of active subdomains for the current variable.
4539  const auto & active_subdomains
4540  = vars_active_subdomains[var_id];
4541 
4542  for (unsigned int j=0; it!=subdomain_map.end(); ++it, ++j)
4543  {
4544  // Skip any variable/subdomain pairs that are inactive.
4545  // Note that if active_subdomains is empty, it is interpreted
4546  // as being active on *all* subdomains.
4547  if (!(active_subdomains.empty() || active_subdomains.count(it->first)))
4548  continue;
4549 
4550  // Get reference to list of elem ids which are in the
4551  // current subdomain and count, allocate storage to hold
4552  // data that will be written to file.
4553  const auto & elem_nums = it->second;
4554  const unsigned int num_elems_this_block =
4555  cast_int<unsigned int>(elem_nums.size());
4556  std::vector<Real> data(num_elems_this_block);
4557 
4558  // variable-major ordering is:
4559  // (u1, u2, u3, ..., uN), (v1, v2, v3, ..., vN), ...
4560  // where N is the number of elements.
4561  for (unsigned int k=0; k<num_elems_this_block; ++k)
4562  data[k] = values[var_id*n_elem + elem_nums[k]];
4563 
4564  ex_err = exII::ex_put_var
4565  (ex_id,
4566  timestep,
4567  exII::EX_ELEM_BLOCK,
4568  var_id+1,
4569  this->get_block_id(j),
4570  num_elems_this_block,
4571  MappedOutputVector(data, _single_precision).data());
4572 
4573  EX_CHECK_ERR(ex_err, "Error writing element values.");
4574  }
4575  }
4576 
4577  this->update();
4578 }
dof_id_type n_elem(const MeshBase::const_element_iterator &begin, const MeshBase::const_element_iterator &end)
Count up the number of elements of a specific type (as defined by an iterator range).
Definition: mesh_tools.C:1004
MeshBase & mesh
void update()
Uses ex_update() to flush buffers to file.
virtual dof_id_type n_elem() const =0
processor_id_type processor_id() const
int get_block_id(int index)
Get the block number for the given block index.
uint8_t dof_id_type
Definition: id_types.h:67

◆ write_element_values_element_major()

void libMesh::ExodusII_IO_Helper::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 
)
inherited

Same as the function above, but assume the input 'values' vector is in element-major order, i.e.

{(u1,v1,w1), (u2,v2,w2), ... (uN,vN,wN)} This function is called by ExodusII_IO::write_element_data_from_discontinuous_nodal_data() because ES::build_discontinuous_solution_vector() builds the solution vector in this order.

Note
If some variables are subdomain-restricted, then the tuples will be of different lengths for each element, i.e. {(u1,v1,w1), (u2,v2), ... (uN,vN,wN)} if variable w is not active on element 2.

Definition at line 4583 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_run_only_on_proc0, libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::MappedOutputVector::data(), distance(), libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::get_block_id(), mesh, libMesh::ExodusII_IO_Helper::num_elem_vars, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::update().

4589 {
4590  if ((_run_only_on_proc0) && (this->processor_id() != 0))
4591  return;
4592 
4593  // Ask the file how many element vars it has, store it in the num_elem_vars variable.
4594  ex_err = exII::ex_get_variable_param(ex_id, exII::EX_ELEM_BLOCK, &num_elem_vars);
4595  EX_CHECK_ERR(ex_err, "Error reading number of elemental variables.");
4596 
4597  // We will eventually loop over the element blocks (subdomains) and
4598  // write the data one block (subdomain) at a time. Build a data
4599  // structure that keeps track of how many elements are in each
4600  // subdomain. This will allow us to reserve space in the data vector
4601  // we are going to write.
4602  std::map<subdomain_id_type, unsigned int> subdomain_to_n_elem;
4603  for (const auto & elem : mesh.active_element_ptr_range())
4604  subdomain_to_n_elem[elem->subdomain_id()] += 1;
4605 
4606  // Sanity check: we must have an entry in vars_active_subdomains for
4607  // each variable that we are potentially writing out.
4608  libmesh_assert_equal_to
4609  (vars_active_subdomains.size(),
4610  static_cast<unsigned>(num_elem_vars));
4611 
4612  // The size of the subdomain map is the number of blocks.
4613  auto subdomain_to_n_elem_iter = subdomain_to_n_elem.begin();
4614 
4615  // Store range of active Elem pointers. We are going to loop over
4616  // the elements n_vars * n_subdomains times, so let's make sure
4617  // the predicated iterators aren't slowing us down too much.
4618  ConstElemRange elem_range
4619  (mesh.active_elements_begin(),
4620  mesh.active_elements_end());
4621 
4622  for (unsigned int sbd_idx=0;
4623  subdomain_to_n_elem_iter != subdomain_to_n_elem.end();
4624  ++subdomain_to_n_elem_iter, ++sbd_idx)
4625  for (unsigned int var_id=0; var_id<static_cast<unsigned>(num_elem_vars); ++var_id)
4626  {
4627  // Reference to the set of active subdomains for the current variable.
4628  const auto & active_subdomains
4629  = vars_active_subdomains[var_id];
4630 
4631  // If the vars_active_subdomains container passed to this function
4632  // has an empty entry, it means the variable really is not active on
4633  // _any_ subdomains, not that it is active on _all_ subdomains. This
4634  // is just due to the way that we build the vars_active_subdomains
4635  // container.
4636  if (!active_subdomains.count(subdomain_to_n_elem_iter->first))
4637  continue;
4638 
4639  // Vector to hold values that will be written to Exodus file.
4640  std::vector<Real> data;
4641  data.reserve(subdomain_to_n_elem_iter->second);
4642 
4643  unsigned int values_offset = 0;
4644  for (auto & elem : elem_range)
4645  {
4646  // We'll use the Elem's subdomain id in several places below.
4647  subdomain_id_type sbd_id = elem->subdomain_id();
4648 
4649  // Get reference to the list of variable names defining
4650  // the indexing for the current Elem's subdomain.
4651  auto subdomain_to_var_names_iter =
4652  subdomain_to_var_names.find(sbd_id);
4653 
4654  // It's possible, but unusual, for there to be an Elem
4655  // from a subdomain that has no active variables from the
4656  // set of variables we are currently writing. If that
4657  // happens, we can just go to the next Elem because we
4658  // don't need to advance the offset into the values
4659  // vector, etc.
4660  if (subdomain_to_var_names_iter == subdomain_to_var_names.end())
4661  continue;
4662 
4663  const auto & var_names_this_sbd
4664  = subdomain_to_var_names_iter->second;
4665 
4666  // Only extract values if Elem is in the current subdomain.
4667  if (sbd_id == subdomain_to_n_elem_iter->first)
4668  {
4669  // Location of current var_id in the list of all variables on this
4670  // subdomain. FIXME: linear search but it's over a typically relatively
4671  // short vector of active variable names on this subdomain. We could do
4672  // a nested std::map<string,index> instead of a std::vector where the
4673  // location of the string is implicitly the index..
4674  auto pos =
4675  std::find(var_names_this_sbd.begin(),
4676  var_names_this_sbd.end(),
4677  derived_var_names[var_id]);
4678 
4679  libmesh_error_msg_if(pos == var_names_this_sbd.end(),
4680  "Derived name " << derived_var_names[var_id] << " not found!");
4681 
4682  // Find the current variable's location in the list of all variable
4683  // names on the current Elem's subdomain.
4684  auto true_index =
4685  std::distance(var_names_this_sbd.begin(), pos);
4686 
4687  data.push_back(values[values_offset + true_index]);
4688  }
4689 
4690  // The "true" offset is how much we have to advance the index for each Elem
4691  // in this subdomain.
4692  auto true_offset = var_names_this_sbd.size();
4693 
4694  // Increment to the next Elem's values
4695  values_offset += true_offset;
4696  } // for elem
4697 
4698  // Now write 'data' to Exodus file, in single precision if requested.
4699  if (!data.empty())
4700  {
4701  ex_err = exII::ex_put_var
4702  (ex_id,
4703  timestep,
4704  exII::EX_ELEM_BLOCK,
4705  var_id+1,
4706  this->get_block_id(sbd_idx),
4707  data.size(),
4708  MappedOutputVector(data, _single_precision).data());
4709 
4710  EX_CHECK_ERR(ex_err, "Error writing element values.");
4711  }
4712  } // for each var_id
4713 
4714  this->update();
4715 }
MeshBase & mesh
The StoredRange class defines a contiguous, divisible set of objects.
Definition: stored_range.h:54
Real distance(const Point &p)
void update()
Uses ex_update() to flush buffers to file.
processor_id_type processor_id() const
int get_block_id(int index)
Get the block number for the given block index.

◆ write_elements()

void libMesh::Nemesis_IO_Helper::write_elements ( const MeshBase mesh,
bool  use_discontinuous = false 
)
overridevirtual

This function is specialized to write the connectivity.

Reimplemented from libMesh::ExodusII_IO_Helper.

Definition at line 2269 of file nemesis_io_helper.C.

References block_id_to_elem_connectivity, libMesh::MeshBase::elem_ref(), libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::exodus_elem_num_to_libmesh, libMesh::ExodusII_IO_Helper::NamesData::get_char_star_star(), libMesh::ExodusII_IO_Helper::get_conversion(), global_elem_blk_ids, libMesh::make_range(), mesh, libMesh::Elem::n_nodes(), num_elem_blks_global, libMesh::ExodusII_IO_Helper::num_nodes_per_elem, libMesh::ExodusII_IO_Helper::NamesData::push_back_entry(), and subdomain_map.

2270 {
2271  // Only write elements if there are elements blocks available.
2272  if (this->num_elem_blks_global > 0)
2273  {
2274  // Data structure to store element block names that will be used to
2275  // write the element block names to file.
2276  NamesData names_table(this->num_elem_blks_global, MAX_STR_LENGTH);
2277 
2278  // Loop over all blocks, even if we don't have elements in each block.
2279  // If we don't have elements we need to write out a 0 for that block...
2280  for (auto i : make_range(this->num_elem_blks_global))
2281  {
2282  // Even if there are no elements for this block on the current
2283  // processor, we still want to write its name to file, if
2284  // possible. MeshBase::subdomain_name() will just return an
2285  // empty string if there is no name associated with the current
2286  // block.
2287  names_table.push_back_entry
2288  (mesh.subdomain_name(restrict_int<subdomain_id_type>(this->global_elem_blk_ids[i])));
2289 
2290  // Search for the current global block ID in the map
2291  if (const auto it = this->block_id_to_elem_connectivity.find( this->global_elem_blk_ids[i] );
2292  it == this->block_id_to_elem_connectivity.end())
2293  {
2294  // If not found, write a zero to file....
2295  this->ex_err = exII::ex_put_elem_block(this->ex_id,
2296  this->global_elem_blk_ids[i],
2297  "Empty",
2298  0, /* n. elements in this block */
2299  0, /* n. nodes per element */
2300  0); /* number of attributes per element */
2301 
2302  EX_CHECK_ERR(this->ex_err, "Error writing element block from Nemesis.");
2303  }
2304 
2305  // Otherwise, write the actual block information and connectivity to file
2306  else
2307  {
2308  subdomain_id_type block =
2309  cast_int<subdomain_id_type>(it->first);
2310  const std::vector<int> & this_block_connectivity = it->second;
2311  std::vector<dof_id_type> & elements_in_this_block = subdomain_map[block];
2312 
2313  // Use the first element in this block to get representative information.
2314  // Note that Exodus assumes all elements in a block are of the same type!
2315  // We are using that same assumption here!
2316  const auto & conv =
2317  get_conversion(mesh.elem_ref(elements_in_this_block[0]).type());
2318 
2319  this->num_nodes_per_elem =
2320  mesh.elem_ref(elements_in_this_block[0]).n_nodes();
2321 
2322  ex_err = exII::ex_put_elem_block(ex_id,
2323  block,
2324  conv.exodus_elem_type().c_str(),
2325  elements_in_this_block.size(),
2327  0);
2328  EX_CHECK_ERR(ex_err, "Error writing element block from Nemesis.");
2329 
2330  ex_err = exII::ex_put_elem_conn(ex_id,
2331  block,
2332  this_block_connectivity.data());
2333  EX_CHECK_ERR(ex_err, "Error writing element connectivities from Nemesis.");
2334  }
2335  } // end loop over global block IDs
2336 
2337  // Only call this once, not in the loop above!
2338  ex_err = exII::ex_put_elem_num_map(ex_id,
2339  exodus_elem_num_to_libmesh.empty() ? nullptr : exodus_elem_num_to_libmesh.data());
2340  EX_CHECK_ERR(ex_err, "Error writing element map");
2341 
2342  // Write the element block names to file.
2343  ex_err = exII::ex_put_names(ex_id, exII::EX_ELEM_BLOCK, names_table.get_char_star_star());
2344  EX_CHECK_ERR(ex_err, "Error writing element block names");
2345  } // end if (this->num_elem_blks_global > 0)
2346 }
std::map< subdomain_id_type, std::vector< dof_id_type > > subdomain_map
Map of subdomains to element numbers.
TestClass subdomain_id_type
Based on the 4-byte comment warning above, this probably doesn&#39;t work with exodusII at all...
Definition: id_types.h:43
std::vector< int > exodus_elem_num_to_libmesh
MeshBase & mesh
const ExodusII_IO_Helper::Conversion & get_conversion(const ElemType type) const
std::vector< int > global_elem_blk_ids
Read the global element block IDs and counts.
std::map< int, std::vector< int > > block_id_to_elem_connectivity
This is the block connectivity, i.e.
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176

◆ write_elemset_data()

void libMesh::ExodusII_IO_Helper::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 
)
inherited

Write elemset data for the requested timestep.

Definition at line 4079 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_run_only_on_proc0, libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::ELEMSET, libMesh::ExodusII_IO_Helper::elemset_ids, libMesh::ExodusII_IO_Helper::elemset_list, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::index_range(), libMesh::ExodusII_IO_Helper::num_elem_sets, libMesh::ExodusII_IO_Helper::num_elems_per_set, libMesh::ParallelObject::processor_id(), libMesh::ExodusII_IO_Helper::read_elemset(), libMesh::ExodusII_IO_Helper::read_elemset_info(), and libMesh::ExodusII_IO_Helper::write_var_names().

4083 {
4084  LOG_SCOPE("write_elemset_data()", "ExodusII_IO_Helper");
4085 
4086  if ((_run_only_on_proc0) && (this->processor_id() != 0))
4087  return;
4088 
4089  // Write the elemset variable names to file. This function should
4090  // only be called once for ELEMSET variables, repeated calls to
4091  // write_var_names() overwrites/changes the order of names that were
4092  // there previously, and will mess up any data that has already been
4093  // written.
4094  this->write_var_names(ELEMSET, var_names);
4095 
4096  // We now call the API to read the elemset info even though we are
4097  // in the middle of writing. This is a bit counter-intuitive, but it
4098  // seems to work provided that you have already written the mesh
4099  // itself... read_elemset_info() fills in the following data
4100  // members:
4101  // .) id_to_elemset_names
4102  // .) num_elems_per_set
4103  // .) num_elem_df_per_set
4104  // .) elemset_list
4105  // .) elemset_id_list
4106  // .) id_to_elemset_names
4107  this->read_elemset_info();
4108 
4109  // The "truth" table for elemset variables. elemset_var_tab is a
4110  // logically (num_elem_sets x num_elemset_vars) integer array of 0s and
4111  // 1s indicating which elemsets a given elemset variable is defined
4112  // on.
4113  std::vector<int> elemset_var_tab(num_elem_sets * var_names.size());
4114 
4115  int offset=0;
4116  for (int es=0; es<num_elem_sets; ++es)
4117  {
4118  // Debugging
4119  // libMesh::out << "Writing elemset variable values for elemset "
4120  // << es << ", elemset_id = " << elemset_ids[es]
4121  // << std::endl;
4122 
4123  // We know num_elems_per_set because we called read_elemset_info() above.
4124  offset += (es > 0 ? num_elems_per_set[es-1] : 0);
4125  this->read_elemset(es, offset);
4126 
4127  // For each variable in var_names, write the values for the
4128  // current elemset, if any.
4129  for (auto var : index_range(var_names))
4130  {
4131  // Debugging
4132  // libMesh::out << "Writing elemset variable values for var " << var << std::endl;
4133 
4134  // If this var has no values on this elemset, go to the next one.
4135  if (!elemset_ids_in[var].count(elemset_ids[es]))
4136  continue;
4137 
4138  // Otherwise, fill in this entry of the nodeset truth table.
4139  elemset_var_tab[es*var_names.size() + var] = 1;
4140 
4141  // Data vector that will eventually be passed to exII::ex_put_var().
4142  std::vector<Real> elemset_var_vals(num_elems_per_set[es]);
4143 
4144  // Get reference to the (elem_id, elemset_id) -> Real map for this variable.
4145  const auto & data_map = elemset_vals[var];
4146 
4147  // Loop over entries in current elemset.
4148  for (int i=0; i<num_elems_per_set[es]; ++i)
4149  {
4150  // Here we convert Exodus elem ids to libMesh node ids
4151  // simply by subtracting 1. We should probably use the
4152  // exodus_elem_num_to_libmesh data structure for this,
4153  // but I don't think it is set up at the time when this
4154  // function is normally called.
4155  dof_id_type libmesh_elem_id = elemset_list[i + offset] - 1;
4156 
4157  // Construct a key to look up values in data_map.
4158  std::pair<dof_id_type, elemset_id_type> key =
4159  std::make_pair(libmesh_elem_id, elemset_ids[es]);
4160 
4161  // Debugging:
4162  // libMesh::out << "Searching for key = (" << key.first << ", " << key.second << ")" << std::endl;
4163 
4164  // We require that the user provided either no values for
4165  // this (var, elemset) combination (in which case we don't
4166  // reach this point) or a value for _every_ elem in this
4167  // elemset for this var, so we use the libmesh_map_find()
4168  // macro to check for this.
4169  elemset_var_vals[i] = libmesh_map_find(data_map, key);
4170  } // end for (node in nodeset[ns])
4171 
4172  // Write elemset values to Exodus file
4173  if (elemset_var_vals.size() > 0)
4174  {
4175  ex_err = exII::ex_put_var
4176  (ex_id,
4177  timestep,
4178  exII::EX_ELEM_SET,
4179  var + 1, // 1-based variable index of current variable
4180  elemset_ids[es],
4181  num_elems_per_set[es],
4182  MappedOutputVector(elemset_var_vals, _single_precision).data());
4183  EX_CHECK_ERR(ex_err, "Error writing elemset vars.");
4184  }
4185  } // end for (var in var_names)
4186  } // end for (ns)
4187 
4188  // Finally, write the elemset truth table to file.
4189  ex_err =
4190  exII::ex_put_truth_table(ex_id,
4191  exII::EX_ELEM_SET, // exII::ex_entity_type
4192  num_elem_sets,
4193  cast_int<int>(var_names.size()),
4194  elemset_var_tab.data());
4195  EX_CHECK_ERR(ex_err, "Error writing elemset var truth table.");
4196 }
std::vector< int > num_elems_per_set
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().
void read_elemset(int id, int offset)
Reads information about elemset id and inserts it into the global elemset array at the position offse...
void read_elemset_info()
Reads information about all of the elemsets in the ExodusII mesh file.
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153
uint8_t dof_id_type
Definition: id_types.h:67

◆ write_elemsets()

void libMesh::ExodusII_IO_Helper::write_elemsets ( const MeshBase mesh)
inherited

Write elemsets stored on the Mesh to the exo file.

Definition at line 3585 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_run_only_on_proc0, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::MeshBase::get_elem_integer_index(), libMesh::MeshBase::get_elemsets(), libMesh::MeshBase::has_elem_integer(), libMesh::ExodusII_IO_Helper::libmesh_elem_num_to_exodus, mesh, libMesh::MeshBase::n_elemsets(), libMesh::ExodusII_IO_Helper::num_elem_sets, and libMesh::ParallelObject::processor_id().

3586 {
3587  LOG_SCOPE("write_elemsets()", "ExodusII_IO_Helper");
3588 
3589  if ((_run_only_on_proc0) && (this->processor_id() != 0))
3590  return;
3591 
3592  // TODO: Add support for named elemsets
3593  // NamesData names_table(elemsets.size(), _max_name_length);
3594 
3595  // We only need to write elemsets if the Mesh has an extra elem
3596  // integer called "elemset_code" defined on it.
3597  if (mesh.has_elem_integer("elemset_code"))
3598  {
3599  std::map<elemset_id_type, std::vector<int>> exodus_elemsets;
3600 
3601  unsigned int elemset_index =
3602  mesh.get_elem_integer_index("elemset_code");
3603 
3604  // Catch ids returned from MeshBase::get_elemsets() calls
3605  MeshBase::elemset_type set_ids;
3606  for (const auto & elem : mesh.element_ptr_range())
3607  {
3608  dof_id_type elemset_code =
3609  elem->get_extra_integer(elemset_index);
3610 
3611  // Look up which element set ids (if any) this elemset_code corresponds to.
3612  mesh.get_elemsets(elemset_code, set_ids);
3613 
3614  // Debugging
3615  // libMesh::out << "elemset_code = " << elemset_code << std::endl;
3616  // for (const auto & set_id : set_ids)
3617  // libMesh::out << set_id << " ";
3618  // libMesh::out << std::endl;
3619 
3620  // Store this Elem id in every set to which it belongs.
3621  for (const auto & set_id : set_ids)
3622  exodus_elemsets[set_id].push_back(libmesh_elem_num_to_exodus[elem->id()]);
3623  }
3624 
3625  // Debugging: print contents of exodus_elemsets map
3626  // for (const auto & [set_id, elem_ids] : exodus_elemsets)
3627  // {
3628  // libMesh::out << "elemset " << set_id << ": ";
3629  // for (const auto & elem_id : elem_ids)
3630  // libMesh::out << elem_id << " ";
3631  // libMesh::out << std::endl;
3632  // }
3633 
3634  // Only continue if we actually had some elements in sets
3635  if (!exodus_elemsets.empty())
3636  {
3637  // Reserve space, loop over newly-created map, construct
3638  // exII::ex_set objects to be passed to exII::ex_put_sets(). Note:
3639  // we do non-const iteration since Exodus requires non-const pointers
3640  // to be passed to its APIs.
3641  std::vector<exII::ex_set> sets;
3642  sets.reserve(exodus_elemsets.size());
3643 
3644  for (auto & [elem_set_id, ids_vec] : exodus_elemsets)
3645  {
3646  // TODO: Add support for named elemsets
3647  // names_table.push_back_entry(mesh.get_elemset_name(elem_set_id));
3648 
3649  exII::ex_set & current_set = sets.emplace_back();
3650  current_set.id = elem_set_id;
3651  current_set.type = exII::EX_ELEM_SET;
3652  current_set.num_entry = ids_vec.size();
3653  current_set.num_distribution_factor = 0;
3654  current_set.entry_list = ids_vec.data();
3655  current_set.extra_list = nullptr; // extra_list is used for sidesets, not needed for elemsets
3656  current_set.distribution_factor_list = nullptr; // not used for elemsets
3657  }
3658 
3659  // Sanity check: make sure the number of elemsets we already wrote to the header
3660  // matches the number of elemsets we just constructed by looping over the Mesh.
3661  libmesh_assert_msg(num_elem_sets == cast_int<int>(exodus_elemsets.size()),
3662  "Mesh has " << exodus_elemsets.size()
3663  << " elemsets, but header was written with num_elem_sets == " << num_elem_sets);
3664  libmesh_assert_msg(num_elem_sets == cast_int<int>(mesh.n_elemsets()),
3665  "mesh.n_elemsets() == " << mesh.n_elemsets()
3666  << ", but header was written with num_elem_sets == " << num_elem_sets);
3667 
3668  ex_err = exII::ex_put_sets(ex_id, exodus_elemsets.size(), sets.data());
3669  EX_CHECK_ERR(ex_err, "Error writing elemsets");
3670 
3671  // TODO: Add support for named elemsets
3672  // ex_err = exII::ex_put_names(ex_id, exII::EX_ELEM_SET, names_table.get_char_star_star());
3673  // EX_CHECK_ERR(ex_err, "Error writing elemset names");
3674  } // end if (!exodus_elemsets.empty())
3675  } // end if (mesh.has_elem_integer("elemset_code"))
3676 }
bool has_elem_integer(std::string_view name) const
Definition: mesh_base.C:701
MeshBase & mesh
void get_elemsets(dof_id_type elemset_code, MeshBase::elemset_type &id_set_to_fill) const
Look up the element sets for a given elemset code and vice-versa.
Definition: mesh_base.C:487
unsigned int get_elem_integer_index(std::string_view name) const
Definition: mesh_base.C:689
unsigned int n_elemsets() const
Returns the number of unique elemset ids which have been added via add_elemset_code(), which is the size of the _all_elemset_ids set.
Definition: mesh_base.C:482
std::map< dof_id_type, dof_id_type > libmesh_elem_num_to_exodus
std::set< elemset_id_type > elemset_type
Typedef for the "set" container used to store elemset ids.
Definition: mesh_base.h:456
processor_id_type processor_id() const
uint8_t dof_id_type
Definition: id_types.h:67

◆ write_exodus_initialization_info()

void libMesh::Nemesis_IO_Helper::write_exodus_initialization_info ( const MeshBase pmesh,
const std::string &  title 
)
private

This function writes exodus-specific initialization information.

This information is slightly different when you are working with Nemesis, as it depends on some global information being known.

Definition at line 919 of file nemesis_io_helper.C.

References distance(), libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, global_nodeset_ids, global_sideset_ids, libMesh::ExodusII_IO_Helper::num_dim, libMesh::ExodusII_IO_Helper::num_elem, libMesh::ExodusII_IO_Helper::num_elem_blk, num_elem_blks_global, libMesh::ExodusII_IO_Helper::num_node_sets, libMesh::ExodusII_IO_Helper::num_nodes, and libMesh::ExodusII_IO_Helper::num_side_sets.

Referenced by initialize().

921 {
922  this->num_elem = static_cast<unsigned int>(std::distance (pmesh.active_local_elements_begin(),
923  pmesh.active_local_elements_end()));
924 
925  // Exodus will also use *global* number of side and node sets,
926  // though it will not write out entries for all of them...
927  this->num_side_sets =
928  cast_int<int>(this->global_sideset_ids.size());
929  this->num_node_sets =
930  cast_int<int>(this->global_nodeset_ids.size());
931 
932  // We need to write the global number of blocks, even though this processor might not have
933  // elements in some of them!
934  this->num_elem_blk = this->num_elem_blks_global;
935 
936  ex_err = exII::ex_put_init(ex_id,
937  title_in.c_str(),
938  this->num_dim,
939  this->num_nodes,
940  this->num_elem,
941  this->num_elem_blk,
942  this->num_node_sets,
943  this->num_side_sets);
944 
945  EX_CHECK_ERR(ex_err, "Error initializing new Nemesis file.");
946 }
std::vector< int > global_nodeset_ids
Containers for reading global nodeset information.
std::vector< int > global_sideset_ids
Containers for reading global sideset (boundary conditions) information.
Real distance(const Point &p)

◆ write_global_values()

void libMesh::ExodusII_IO_Helper::write_global_values ( const std::vector< Real > &  values,
int  timestep 
)
inherited

Writes the vector of global variables.

Definition at line 4786 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_run_only_on_proc0, libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::num_global_vars, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::update().

4787 {
4788  if ((_run_only_on_proc0) && (this->processor_id() != 0))
4789  return;
4790 
4791  if (!values.empty())
4792  {
4793  ex_err = exII::ex_put_var
4794  (ex_id,
4795  timestep,
4796  exII::EX_GLOBAL,
4797  1, // var index
4798  0, // obj_id (not used)
4800  MappedOutputVector(values, _single_precision).data());
4801 
4802  EX_CHECK_ERR(ex_err, "Error writing global values.");
4803 
4804  this->update();
4805  }
4806 }
void update()
Uses ex_update() to flush buffers to file.
processor_id_type processor_id() const

◆ write_information_records()

void libMesh::ExodusII_IO_Helper::write_information_records ( const std::vector< std::string > &  records)
inherited

Writes the vector of information records.

Definition at line 4748 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_run_only_on_proc0, libMesh::err, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::update().

4749 {
4750  if ((_run_only_on_proc0) && (this->processor_id() != 0))
4751  return;
4752 
4753  // There may already be information records in the file (for
4754  // example, if we're appending) and in that case, according to the
4755  // Exodus documentation, writing more information records is not
4756  // supported.
4757  int num_info = inquire(*this, exII::EX_INQ_INFO, "Error retrieving the number of information records from file!");
4758  if (num_info > 0)
4759  {
4760  libMesh::err << "Warning! The Exodus file already contains information records.\n"
4761  << "Exodus does not support writing additional records in this situation."
4762  << std::endl;
4763  return;
4764  }
4765 
4766  int num_records = cast_int<int>(records.size());
4767 
4768  if (num_records > 0)
4769  {
4770  NamesData info(num_records, MAX_LINE_LENGTH);
4771 
4772  // If an entry is longer than MAX_LINE_LENGTH characters it's not an error, we just
4773  // write the first MAX_LINE_LENGTH characters to the file.
4774  for (const auto & record : records)
4775  info.push_back_entry(record);
4776 
4777  ex_err = exII::ex_put_info(ex_id, num_records, info.get_char_star_star());
4778  EX_CHECK_ERR(ex_err, "Error writing global values.");
4779 
4780  this->update();
4781  }
4782 }
OStreamProxy err
MPI_Info info
void update()
Uses ex_update() to flush buffers to file.
processor_id_type processor_id() const

◆ write_nodal_coordinates()

void libMesh::Nemesis_IO_Helper::write_nodal_coordinates ( const MeshBase mesh,
bool  use_discontinuous = false 
)
overridevirtual

This function is specialized from ExodusII_IO_Helper to write only the nodal coordinates stored on the local piece of the Mesh.

Reimplemented from libMesh::ExodusII_IO_Helper.

Definition at line 2224 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::MappedOutputVector::data(), libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::exodus_node_num_to_libmesh, libMesh::make_range(), mesh, libMesh::ExodusII_IO_Helper::x, libMesh::ExodusII_IO_Helper::y, and libMesh::ExodusII_IO_Helper::z.

2225 {
2226  auto local_num_nodes = this->exodus_node_num_to_libmesh.size();
2227 
2228  x.resize(local_num_nodes);
2229  y.resize(local_num_nodes);
2230  z.resize(local_num_nodes);
2231 
2232  // Just loop over our list outputting the nodes the way we built the map
2233  for (auto i : make_range(local_num_nodes))
2234  {
2235  const Point & pt = mesh.point(this->exodus_node_num_to_libmesh[i]-1);
2236  x[i]=pt(0);
2237  y[i]=pt(1);
2238  z[i]=pt(2);
2239  }
2240 
2241  if (local_num_nodes)
2242  {
2243  // Call Exodus API to write nodal coordinates...
2244  ex_err = exII::ex_put_coord
2245  (ex_id,
2246  x.empty() ? nullptr : MappedOutputVector(x, _single_precision).data(),
2247  y.empty() ? nullptr : MappedOutputVector(y, _single_precision).data(),
2248  z.empty() ? nullptr : MappedOutputVector(z, _single_precision).data());
2249  EX_CHECK_ERR(ex_err, "Error writing node coordinates");
2250 
2251  // And write the nodal map we created for them
2252  ex_err = exII::ex_put_node_num_map(ex_id, this->exodus_node_num_to_libmesh.data());
2253  EX_CHECK_ERR(ex_err, "Error writing node num map");
2254  }
2255  else // Does the Exodus API want us to write empty nodal coordinates?
2256  {
2257  ex_err = exII::ex_put_coord(ex_id, nullptr, nullptr, nullptr);
2258  EX_CHECK_ERR(ex_err, "Error writing empty node coordinates");
2259 
2260  ex_err = exII::ex_put_node_num_map(ex_id, nullptr);
2261  EX_CHECK_ERR(ex_err, "Error writing empty node num map");
2262  }
2263 }
MeshBase & mesh
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176
std::vector< int > exodus_node_num_to_libmesh

◆ write_nodal_solution() [1/3]

void libMesh::Nemesis_IO_Helper::write_nodal_solution ( const NumericVector< Number > &  parallel_soln,
const std::vector< std::string > &  names,
int  timestep,
const std::vector< std::string > &  output_names 
)

Takes a parallel solution vector containing the node-major solution vector for all variables and outputs it to the files.

Parameters
parallel_soln
namesA vector containing the names of all variables in parallel_soln.
timestepTo be passed to the ExodusII_IO_Helper::write_nodal_values() function.
output_namesA vector containing the names of variables in parallel_soln that should actually be written (whitelist).
Note
This version of write_nodal_solution() is called by the parallel version of Nemesis_IO::write_nodal_data(), which is called by MeshOutput::write_equation_systems() for parallel I/O formats like Nemesis. The other version is still available to continue supporting things like NamebasedIO::write_nodal_data(), but this version should be preferred when running in parallel.

Definition at line 2390 of file nemesis_io_helper.C.

References distance(), libMesh::ExodusII_IO_Helper::exodus_node_num_to_libmesh, libMesh::NumericVector< T >::localize(), libMesh::ExodusII_IO_Helper::num_nodes, and libMesh::ExodusII_IO_Helper::write_nodal_values().

2394 {
2395  int num_vars = cast_int<int>(names.size());
2396 
2397  for (int c=0; c<num_vars; c++)
2398  {
2399  // Find the position of names[c] in the output_names vector, if it exists.
2400  auto pos = std::find(output_names.begin(), output_names.end(), names[c]);
2401 
2402  // Skip names[c] if it's not supposed to be output.
2403  if (pos == output_names.end())
2404  continue;
2405 
2406  // Compute the (zero-based) index which determines which
2407  // variable this will be as far as Nemesis is concerned. This
2408  // will be used below in the write_nodal_values() call.
2409  int variable_name_position =
2410  cast_int<int>(std::distance(output_names.begin(), pos));
2411 
2412  // Fill up a std::vector with the dofs for the current variable
2413  std::vector<numeric_index_type> required_indices(this->num_nodes);
2414 
2415  for (int i=0; i<this->num_nodes; i++)
2416  required_indices[i] = static_cast<dof_id_type>(this->exodus_node_num_to_libmesh[i]-1) * num_vars + c;
2417 
2418  // Get the dof values required to write just our local part of
2419  // the solution vector.
2420  std::vector<Number> local_soln;
2421  parallel_soln.localize(local_soln, required_indices);
2422 
2423 #ifndef LIBMESH_USE_COMPLEX_NUMBERS
2424  // Call the ExodusII_IO_Helper function to write the data.
2425  write_nodal_values(variable_name_position + 1, local_soln, timestep);
2426 #else
2427  // We have the local (complex) values. Now extract the real,
2428  // imaginary, and magnitude values from them.
2429  std::vector<Real> real_parts(num_nodes);
2430  std::vector<Real> imag_parts(num_nodes);
2431  std::vector<Real> magnitudes(num_nodes);
2432 
2433  for (int i=0; i<num_nodes; ++i)
2434  {
2435  real_parts[i] = local_soln[i].real();
2436  imag_parts[i] = local_soln[i].imag();
2437  magnitudes[i] = std::abs(local_soln[i]);
2438  }
2439 
2440  // Write the real, imaginary, and magnitude values to file.
2441  write_nodal_values(3 * variable_name_position + 1, real_parts, timestep);
2442  write_nodal_values(3 * variable_name_position + 2, imag_parts, timestep);
2443  write_nodal_values(3 * variable_name_position + 3, magnitudes, timestep);
2444 #endif
2445  }
2446 }
void write_nodal_values(int var_id, const std::vector< Real > &values, int timestep)
Writes the vector of values to a nodal variable.
Real distance(const Point &p)
std::vector< int > exodus_node_num_to_libmesh
virtual void localize(std::vector< T > &v_local) const =0
Creates a copy of the global vector in the local vector v_local.

◆ write_nodal_solution() [2/3]

void libMesh::Nemesis_IO_Helper::write_nodal_solution ( const EquationSystems es,
const std::vector< std::pair< unsigned int, unsigned int >> &  var_nums,
int  timestep,
const std::vector< std::string > &  output_names 
)

Outputs EquationSystems current_local_solution nodal values.

Definition at line 2450 of file nemesis_io_helper.C.

References libMesh::Variable::active_on_subdomain(), libMesh::System::current_local_solution, distance(), libMesh::DofMap::dof_indices(), libMesh::DofObject::dof_number(), libMesh::ExodusII_IO_Helper::exodus_node_num_to_libmesh, libMesh::FEType::family, libMesh::System::get_dof_map(), libMesh::EquationSystems::get_mesh(), libMesh::EquationSystems::get_system(), libMesh::index_range(), libMesh::ExodusII_IO_Helper::libmesh_node_num_to_exodus, mesh, libMesh::DofObject::n_comp(), libMesh::Quality::name(), libMesh::FEInterface::nodal_soln(), libMesh::ExodusII_IO_Helper::num_nodes, libMesh::SCALAR, libMesh::DofMap::SCALAR_dof_indices(), libMesh::System::variable(), libMesh::System::variable_name(), libMesh::System::variable_type(), and libMesh::ExodusII_IO_Helper::write_nodal_values().

2454 {
2455  const MeshBase & mesh = es.get_mesh();
2456 
2457  // FIXME - half this code might be replaceable with a call to
2458  // EquationSystems::build_parallel_solution_vector()...
2459 
2460  for (auto [sys_num, var] : var_nums)
2461  {
2462  const System & sys = es.get_system(sys_num);
2463  const std::string & name = sys.variable_name(var);
2464 
2465  auto pos = std::find(output_names.begin(), output_names.end(), name);
2466 
2467  // Skip this name if it's not supposed to be output.
2468  if (pos == output_names.end())
2469  continue;
2470 
2471  // Compute the (zero-based) index which determines which
2472  // variable this will be as far as Nemesis is concerned. This
2473  // will be used below in the write_nodal_values() call.
2474  int variable_name_position =
2475  cast_int<int>(std::distance(output_names.begin(), pos));
2476 
2477  // Fill up a std::vector with the dofs for the current variable
2478  std::vector<numeric_index_type> required_indices(this->num_nodes);
2479 
2480  // Get the dof values required to write just our local part of
2481  // the solution vector.
2482  std::vector<Number> local_soln;
2483 
2484  const FEType type = sys.variable_type(var);
2485  if (type.family == SCALAR)
2486  {
2487  std::vector<numeric_index_type> scalar_indices;
2488  sys.get_dof_map().SCALAR_dof_indices(scalar_indices, var);
2489  for (int i=0; i<this->num_nodes; i++)
2490  required_indices[i] = scalar_indices[0];
2491  sys.current_local_solution->get(required_indices, local_soln);
2492  }
2493  else
2494  {
2495  // If we have DoFs at all nodes, e.g. for isoparametric
2496  // elements, this is easy:
2497  bool found_all_indices = true;
2498  for (int i=0; i<this->num_nodes; i++)
2499  {
2500  const Node & node = mesh.node_ref(this->exodus_node_num_to_libmesh[i]-1);
2501  if (node.n_comp(sys_num, var))
2502  required_indices[i] = node.dof_number(sys_num, var, 0);
2503  else
2504  {
2505  found_all_indices = false;
2506  break;
2507  }
2508  }
2509 
2510  if (found_all_indices)
2511  sys.current_local_solution->get(required_indices, local_soln);
2512  // Fine, we'll do it the hard way
2513  if (!found_all_indices)
2514  {
2515  local_soln.resize(num_nodes);
2516 
2517  const Variable & var_description = sys.variable(var);
2518  const DofMap & dof_map = sys.get_dof_map();
2519 
2520  NumericVector<Number> & sys_soln(*sys.current_local_solution);
2521  std::vector<Number> elem_soln; // The finite element solution
2522  std::vector<Number> nodal_soln; // The FE solution interpolated to the nodes
2523  std::vector<dof_id_type> dof_indices; // The DOF indices for the finite element
2524 
2525  for (const auto & elem : mesh.active_local_element_ptr_range())
2526  if (var_description.active_on_subdomain(elem->subdomain_id()))
2527  {
2528  dof_map.dof_indices (elem, dof_indices, var);
2529  elem_soln.resize(dof_indices.size());
2530 
2531  for (auto i : index_range(dof_indices))
2532  elem_soln[i] = sys_soln(dof_indices[i]);
2533 
2534  FEInterface::nodal_soln (elem->dim(),
2535  type,
2536  elem,
2537  elem_soln,
2538  nodal_soln);
2539 
2540  // infinite elements should be skipped...
2541  if (!elem->infinite())
2542  for (auto n : elem->node_index_range())
2543  {
2544  const std::size_t exodus_num =
2545  libmesh_node_num_to_exodus[elem->node_id(n)];
2546  libmesh_assert_greater(exodus_num, 0);
2547  libmesh_assert_less(exodus_num-1, local_soln.size());
2548  local_soln[exodus_num-1] = nodal_soln[n];
2549  }
2550  }
2551  }
2552  }
2553 
2554 #ifndef LIBMESH_USE_COMPLEX_NUMBERS
2555  // Call the ExodusII_IO_Helper function to write the data.
2556  write_nodal_values(variable_name_position + 1, local_soln, timestep);
2557 #else
2558  // We have the local (complex) values. Now extract the real,
2559  // imaginary, and magnitude values from them.
2560  std::vector<Real> real_parts(num_nodes);
2561  std::vector<Real> imag_parts(num_nodes);
2562  std::vector<Real> magnitudes(num_nodes);
2563 
2564  for (int i=0; i<num_nodes; ++i)
2565  {
2566  real_parts[i] = local_soln[i].real();
2567  imag_parts[i] = local_soln[i].imag();
2568  magnitudes[i] = std::abs(local_soln[i]);
2569  }
2570 
2571  // Write the real, imaginary, and magnitude values to file.
2572  write_nodal_values(3 * variable_name_position + 1, real_parts, timestep);
2573  write_nodal_values(3 * variable_name_position + 2, imag_parts, timestep);
2574  write_nodal_values(3 * variable_name_position + 3, magnitudes, timestep);
2575 #endif
2576  }
2577 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
MeshBase & mesh
void write_nodal_values(int var_id, const std::vector< Real > &values, int timestep)
Writes the vector of values to a nodal variable.
Real distance(const Point &p)
std::map< dof_id_type, dof_id_type > libmesh_node_num_to_exodus
std::vector< int > exodus_node_num_to_libmesh
static void nodal_soln(const unsigned int dim, const FEType &fe_t, const Elem *elem, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln, const bool add_p_level=true, const unsigned int vdim=1)
Build the nodal soln from the element soln.
Definition: fe_interface.C:626
template class LIBMESH_EXPORT NumericVector< Number >
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153

◆ write_nodal_solution() [3/3]

void libMesh::Nemesis_IO_Helper::write_nodal_solution ( const std::vector< Number > &  values,
const std::vector< std::string > &  names,
int  timestep 
)

Takes a solution vector containing the solution for all variables and outputs it to the files.

Definition at line 2352 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::exodus_node_num_to_libmesh, libMesh::ExodusII_IO_Helper::num_nodes, value, and libMesh::ExodusII_IO_Helper::write_nodal_values().

2355 {
2356  int num_vars = cast_int<int>(names.size());
2357  //int num_values = values.size(); // Not used?
2358 
2359  for (int c=0; c<num_vars; c++)
2360  {
2361 #ifdef LIBMESH_USE_COMPLEX_NUMBERS
2362  std::vector<Real> real_parts(num_nodes);
2363  std::vector<Real> imag_parts(num_nodes);
2364  std::vector<Real> magnitudes(num_nodes);
2365 
2366  for (int i=0; i<num_nodes; ++i)
2367  {
2368  Number value = values[(this->exodus_node_num_to_libmesh[i]-1)*num_vars + c];
2369  real_parts[i] = value.real();
2370  imag_parts[i] = value.imag();
2371  magnitudes[i] = std::abs(value);
2372  }
2373  write_nodal_values(3*c+1,real_parts,timestep);
2374  write_nodal_values(3*c+2,imag_parts,timestep);
2375  write_nodal_values(3*c+3,magnitudes,timestep);
2376 #else
2377  std::vector<Number> cur_soln(this->num_nodes);
2378 
2379  // Copy out this variable's solution
2380  for (int i=0; i<this->num_nodes; i++)
2381  cur_soln[i] = values[(this->exodus_node_num_to_libmesh[i]-1)*num_vars + c];
2382 
2383  write_nodal_values(c+1,cur_soln,timestep);
2384 #endif
2385  }
2386 }
void write_nodal_values(int var_id, const std::vector< Real > &values, int timestep)
Writes the vector of values to a nodal variable.
static const bool value
Definition: xdr_io.C:55
std::vector< int > exodus_node_num_to_libmesh

◆ write_nodal_values()

void libMesh::ExodusII_IO_Helper::write_nodal_values ( int  var_id,
const std::vector< Real > &  values,
int  timestep 
)
inherited

Writes the vector of values to a nodal variable.

Definition at line 4720 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_run_only_on_proc0, libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::num_nodes, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::update().

Referenced by write_nodal_solution().

4723 {
4724  if ((_run_only_on_proc0) && (this->processor_id() != 0))
4725  return;
4726 
4727  if (!values.empty())
4728  {
4729  libmesh_assert_equal_to(values.size(), std::size_t(num_nodes));
4730 
4731  ex_err = exII::ex_put_var
4732  (ex_id,
4733  timestep,
4734  exII::EX_NODAL,
4735  var_id,
4736  1, // exII::ex_entity_id, not sure exactly what this is but in the ex_put_nodal_var.c shim, they pass 1
4737  num_nodes,
4738  MappedOutputVector(values, _single_precision).data());
4739 
4740  EX_CHECK_ERR(ex_err, "Error writing nodal values.");
4741 
4742  this->update();
4743  }
4744 }
void update()
Uses ex_update() to flush buffers to file.
processor_id_type processor_id() const

◆ write_nodeset_data()

void libMesh::ExodusII_IO_Helper::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 
)
inherited

Write nodeset data for the requested timestep.

Definition at line 3974 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_run_only_on_proc0, libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::index_range(), libMesh::ExodusII_IO_Helper::node_sets_node_index, libMesh::ExodusII_IO_Helper::node_sets_node_list, libMesh::ExodusII_IO_Helper::NODESET, libMesh::ExodusII_IO_Helper::nodeset_ids, libMesh::ExodusII_IO_Helper::num_node_sets, libMesh::ExodusII_IO_Helper::num_nodes_per_set, libMesh::ParallelObject::processor_id(), libMesh::ExodusII_IO_Helper::read_all_nodesets(), and libMesh::ExodusII_IO_Helper::write_var_names().

3978 {
3979  LOG_SCOPE("write_nodeset_data()", "ExodusII_IO_Helper");
3980 
3981  if ((_run_only_on_proc0) && (this->processor_id() != 0))
3982  return;
3983 
3984  // Write the nodeset variable names to file. This function should
3985  // only be called once for NODESET variables, repeated calls to
3986  // write_var_names() overwrites/changes the order of names that were
3987  // there previously, and will mess up any data that has already been
3988  // written.
3989  this->write_var_names(NODESET, var_names);
3990 
3991  // For all nodesets, reads and fills in the arrays:
3992  // nodeset_ids
3993  // num_nodes_per_set
3994  // node_sets_node_index - starting index for each nodeset in the node_sets_node_list vector
3995  // node_sets_node_list
3996  // Note: we need these arrays so that we know what data to write
3997  this->read_all_nodesets();
3998 
3999  // The "truth" table for nodeset variables. nset_var_tab is a
4000  // logically (num_node_sets x num_nset_var) integer array of 0s and
4001  // 1s indicating which nodesets a given nodeset variable is defined
4002  // on.
4003  std::vector<int> nset_var_tab(num_node_sets * var_names.size());
4004 
4005  for (int ns=0; ns<num_node_sets; ++ns)
4006  {
4007  // The offset into the node_sets_node_list for the current nodeset
4008  int offset = node_sets_node_index[ns];
4009 
4010  // For each variable in var_names, write the values for the
4011  // current nodeset, if any.
4012  for (auto var : index_range(var_names))
4013  {
4014  // If this var has no values on this nodeset, go to the next one.
4015  if (!node_boundary_ids[var].count(nodeset_ids[ns]))
4016  continue;
4017 
4018  // Otherwise, fill in this entry of the nodeset truth table.
4019  nset_var_tab[ns*var_names.size() + var] = 1;
4020 
4021  // Data vector that will eventually be passed to exII::ex_put_var().
4022  std::vector<Real> nset_var_vals(num_nodes_per_set[ns]);
4023 
4024  // Get reference to the NodeBCTuple -> Real map for this variable.
4025  const auto & data_map = bc_vals[var];
4026 
4027  // Loop over entries in current nodeset.
4028  for (int i=0; i<num_nodes_per_set[ns]; ++i)
4029  {
4030  // Here we convert Exodus node ids to libMesh node ids by
4031  // subtracting 1. We should probably use the
4032  // exodus_node_num_to_libmesh data structure for this, but
4033  // I don't think it is set up at the time when
4034  // write_nodeset_data() would normally be called.
4035  dof_id_type libmesh_node_id = node_sets_node_list[i + offset] - 1;
4036 
4037  // Construct a key to look up values in data_map.
4039  std::make_tuple(libmesh_node_id, nodeset_ids[ns]);
4040 
4041  // We require that the user provided either no values for
4042  // this (var, nodeset) combination (in which case we don't
4043  // reach this point) or a value for _every_ node in this
4044  // nodeset for this var, so we use the libmesh_map_find()
4045  // macro to check for this.
4046  nset_var_vals[i] = libmesh_map_find(data_map, key);
4047  } // end for (node in nodeset[ns])
4048 
4049  // Write nodeset values to Exodus file
4050  if (nset_var_vals.size() > 0)
4051  {
4052  ex_err = exII::ex_put_var
4053  (ex_id,
4054  timestep,
4055  exII::EX_NODE_SET,
4056  var + 1, // 1-based variable index of current variable
4057  nodeset_ids[ns],
4058  num_nodes_per_set[ns],
4059  MappedOutputVector(nset_var_vals, _single_precision).data());
4060  EX_CHECK_ERR(ex_err, "Error writing nodeset vars.");
4061  }
4062  } // end for (var in var_names)
4063  } // end for (ns)
4064 
4065  // Finally, write the nodeset truth table.
4066  ex_err =
4067  exII::ex_put_truth_table(ex_id,
4068  exII::EX_NODE_SET,
4069  num_node_sets,
4070  cast_int<int>(var_names.size()),
4071  nset_var_tab.data());
4072  EX_CHECK_ERR(ex_err, "Error writing nodeset var truth table.");
4073 }
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().
std::vector< int > node_sets_node_index
std::tuple< dof_id_type, boundary_id_type > NodeBCTuple
Create a list of (node_id, boundary_id) tuples for all relevant nodes.
void read_all_nodesets()
New API that reads all nodesets simultaneously.
std::vector< int > node_sets_node_list
std::vector< int > num_nodes_per_set
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153
uint8_t dof_id_type
Definition: id_types.h:67

◆ write_nodesets()

void libMesh::Nemesis_IO_Helper::write_nodesets ( const MeshBase mesh)
overridevirtual

Writes the nodesets for this processor.

Reimplemented from libMesh::ExodusII_IO_Helper.

Definition at line 1934 of file nemesis_io_helper.C.

References libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, global_nodeset_ids, libMesh::ExodusII_IO_Helper::libmesh_node_num_to_exodus, mesh, libMesh::out, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::verbose.

1935 {
1936  // Write the nodesets. In Nemesis, the idea is to "create space" for the global
1937  // set of boundary nodesets, but to only write node IDs which are local to the current
1938  // processor. This is what is done in Nemesis files created by the "loadbal" script.
1939 
1940  // Store a map of vectors for boundary node IDs on this processor.
1941  // Use a vector of int here so it can be passed directly to Exodus.
1942  std::map<boundary_id_type, std::vector<int>> local_node_boundary_id_lists;
1943 
1944  // FIXME: We should build this list only one time!! We already built it above, but we
1945  // did not have the libmesh to exodus node mapping at that time... for now we'll just
1946  // build it here again, hopefully it's small relative to the size of the entire mesh.
1947 
1948  // Build list of (node-id, bc-id) tuples.
1949  typedef std::tuple<dof_id_type, boundary_id_type> Tuple;
1950  std::vector<Tuple> bc_tuples = mesh.get_boundary_info().build_node_list();
1951 
1952  if (verbose)
1953  {
1954  libMesh::out << "[" << this->processor_id() << "] boundary_node_list.size()="
1955  << bc_tuples.size() << std::endl;
1956  libMesh::out << "[" << this->processor_id() << "] (boundary_node_id, boundary_id) = ";
1957  for (const auto & t : bc_tuples)
1958  libMesh::out << "(" << std::get<0>(t) << ", " << std::get<1>(t) << ") ";
1959  libMesh::out << std::endl;
1960  }
1961 
1962  // For each node in the node list, add it to the vector of node IDs for that
1963  // set for the local processor. This will be used later when writing Exodus
1964  // nodesets.
1965  for (const auto & t : bc_tuples)
1966  {
1967  // Don't try to grab a reference to the vector unless the current node is attached
1968  // to a local element. Otherwise, another processor will be responsible for writing it in its nodeset.
1969  if (const auto it = this->libmesh_node_num_to_exodus.find(std::get<0>(t));
1970  it != this->libmesh_node_num_to_exodus.end())
1971  {
1972  // Get reference to the vector where this node ID will be inserted. If it
1973  // doesn't yet exist, this will create it.
1974  std::vector<int> & current_id_set = local_node_boundary_id_lists[std::get<1>(t)];
1975 
1976  // Push back Exodus-mapped node ID for this set
1977  // TODO: reserve space in these vectors somehow.
1978  current_id_set.push_back( it->second );
1979  }
1980  }
1981 
1982  // See what we got
1983  if (verbose)
1984  {
1985  for (const auto & [bndry_id, set] : local_node_boundary_id_lists)
1986  {
1987  libMesh::out << "[" << this->processor_id() << "] ID: " << bndry_id << ", ";
1988 
1989  // Libmesh node ID (Exodus Node ID)
1990  for (const auto & id : set)
1991  libMesh::out << id << ", ";
1992  libMesh::out << std::endl;
1993  }
1994  }
1995 
1996  // Loop over *global* nodeset IDs, call the Exodus API. Note that some nodesets may be empty
1997  // for a given processor.
1998  if (global_nodeset_ids.size() > 0)
1999  {
2000  NamesData names_table(global_nodeset_ids.size(), MAX_STR_LENGTH);
2001 
2002  for (const auto & nodeset_id : this->global_nodeset_ids)
2003  {
2004  const std::string & current_ns_name =
2005  mesh.get_boundary_info().get_nodeset_name
2006  (cast_int<boundary_id_type>(nodeset_id));
2007 
2008  // Store this name in a data structure that will be used to
2009  // write sideset names to file.
2010  names_table.push_back_entry(current_ns_name);
2011 
2012  if (verbose)
2013  {
2014  libMesh::out << "[" << this->processor_id()
2015  << "] Writing out Exodus nodeset info for ID: " << nodeset_id
2016  << ", Name: " << current_ns_name
2017  << std::endl;
2018  }
2019 
2020  // Convert current global_nodeset_id into an exodus ID, which can't be zero...
2021  int exodus_id = nodeset_id;
2022 
2023  /*
2024  // Exodus can't handle zero nodeset IDs (?) Use max short here since
2025  // when libmesh reads it back in, it will want to store it as a short...
2026  if (exodus_id==0)
2027  exodus_id = std::numeric_limits<short>::max();
2028  */
2029 
2030  // Try to find this boundary ID in the local list we created
2031  if (const auto it = local_node_boundary_id_lists.find (cast_int<boundary_id_type>(nodeset_id));
2032  it == local_node_boundary_id_lists.end())
2033  {
2034  // No nodes found for this boundary ID on this processor
2035  if (verbose)
2036  libMesh::out << "[" << this->processor_id()
2037  << "] No nodeset data for ID: " << nodeset_id
2038  << " on this processor." << std::endl;
2039 
2040  // Call the Exodus interface to write the parameters of this node set
2041  this->ex_err = exII::ex_put_node_set_param(this->ex_id,
2042  exodus_id,
2043  0, /* No nodes for this ID */
2044  0 /* No distribution factors */);
2045  EX_CHECK_ERR(this->ex_err, "Error writing nodeset parameters in Nemesis");
2046 
2047  }
2048  else // Boundary ID *was* found in list
2049  {
2050  // Get reference to the vector of node IDs
2051  const std::vector<int> & current_nodeset_ids = it->second;
2052 
2053  // Call the Exodus interface to write the parameters of this node set
2054  this->ex_err = exII::ex_put_node_set_param(this->ex_id,
2055  exodus_id,
2056  current_nodeset_ids.size(),
2057  0 /* No distribution factors */);
2058 
2059  EX_CHECK_ERR(this->ex_err, "Error writing nodeset parameters in Nemesis");
2060 
2061  // Call Exodus interface to write the actual node IDs for this boundary ID
2062  this->ex_err = exII::ex_put_node_set(this->ex_id,
2063  exodus_id,
2064  current_nodeset_ids.data());
2065 
2066  EX_CHECK_ERR(this->ex_err, "Error writing nodesets in Nemesis");
2067 
2068  }
2069  } // end loop over global nodeset IDs
2070 
2071  // Write out the nodeset names
2072  ex_err = exII::ex_put_names(ex_id,
2073  exII::EX_NODE_SET,
2074  names_table.get_char_star_star());
2075  EX_CHECK_ERR(ex_err, "Error writing nodeset names");
2076  } // end for loop over global nodeset IDs
2077 }
std::vector< int > global_nodeset_ids
Containers for reading global nodeset information.
MeshBase & mesh
std::map< dof_id_type, dof_id_type > libmesh_node_num_to_exodus
OStreamProxy out
processor_id_type processor_id() const

◆ write_sideset_data()

void libMesh::ExodusII_IO_Helper::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 
)
inherited

Write sideset data for the requested timestep.

Definition at line 3682 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_run_only_on_proc0, libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::elem_list, libMesh::MeshBase::elem_ptr(), libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::get_conversion(), libMesh::ExodusII_IO_Helper::Conversion::get_side_map(), libMesh::index_range(), libMesh::ExodusII_IO_Helper::libmesh_elem_num_to_exodus, mesh, libMesh::ExodusII_IO_Helper::num_side_sets, libMesh::ExodusII_IO_Helper::num_sides_per_set, libMesh::ParallelObject::processor_id(), libMesh::ExodusII_IO_Helper::read_sideset(), libMesh::ExodusII_IO_Helper::read_sideset_info(), side_id, libMesh::ExodusII_IO_Helper::side_list, libMesh::ExodusII_IO_Helper::SIDESET, libMesh::ExodusII_IO_Helper::ss_ids, libMesh::Elem::type(), and libMesh::ExodusII_IO_Helper::write_var_names().

3687 {
3688  LOG_SCOPE("write_sideset_data()", "ExodusII_IO_Helper");
3689 
3690  if ((_run_only_on_proc0) && (this->processor_id() != 0))
3691  return;
3692 
3693  // Write the sideset variable names to file. This function should
3694  // only be called once for SIDESET variables, repeated calls to
3695  // write_var_names overwrites/changes the order of names that were
3696  // there previously, and will mess up any data that has already been
3697  // written.
3698  this->write_var_names(SIDESET, var_names);
3699 
3700  // I hope that we are allowed to call read_sideset_info() even
3701  // though we are in the middle of writing? It seems to work provided
3702  // that you have already written the mesh itself... read_sideset_info()
3703  // fills in the following data members:
3704  // .) num_side_sets
3705  // .) ss_ids
3706  this->read_sideset_info();
3707 
3708  // Write "truth" table for sideset variables. The function
3709  // exII::ex_put_variable_param() must be called before
3710  // exII::ex_put_truth_table(). For us, this happens during the call
3711  // to ExodusII_IO_Helper::write_var_names(). sset_var_tab is a logically
3712  // (num_side_sets x num_sset_var) integer array of 0s and 1s
3713  // indicating which sidesets a given sideset variable is defined on.
3714  std::vector<int> sset_var_tab(num_side_sets * var_names.size());
3715 
3716  // We now call read_sideset() once per sideset and write any sideset
3717  // variable values which are defined there.
3718  int offset=0;
3719  for (int ss=0; ss<num_side_sets; ++ss)
3720  {
3721  // We don't know num_sides_per_set for each set until we call
3722  // read_sideset(). The values for each sideset are stored (using
3723  // the offsets) into the 'elem_list' and 'side_list' arrays of
3724  // this class.
3725  offset += (ss > 0 ? num_sides_per_set[ss-1] : 0);
3726  this->read_sideset(ss, offset);
3727 
3728  // For each variable in var_names, write the values for the
3729  // current sideset, if any.
3730  for (auto var : index_range(var_names))
3731  {
3732  // If this var has no values on this sideset, go to the next one.
3733  if (!side_ids[var].count(ss_ids[ss]))
3734  continue;
3735 
3736  // Otherwise, fill in this entry of the sideset truth table.
3737  sset_var_tab[ss*var_names.size() + var] = 1;
3738 
3739  // Data vector that will eventually be passed to exII::ex_put_var().
3740  std::vector<Real> sset_var_vals(num_sides_per_set[ss]);
3741 
3742  // Get reference to the BCTuple -> Real map for this variable.
3743  const auto & data_map = bc_vals[var];
3744 
3745  // Loop over elem_list, side_list entries in current sideset.
3746  for (int i=0; i<num_sides_per_set[ss]; ++i)
3747  {
3748  // Get elem_id and side_id from the respective lists that
3749  // are filled in by calling read_sideset().
3750  //
3751  // Note: these are Exodus-specific ids, so we have to convert them
3752  // to libmesh ids, as that is what will be in the bc_tuples.
3753  //
3754  // TODO: we should probably consult the exodus_elem_num_to_libmesh
3755  // mapping in order to figure out which libmesh element id 'elem_id'
3756  // actually corresponds to here, instead of just assuming it will be
3757  // off by one. Unfortunately that data structure does not seem to
3758  // be used at the moment. If we assume that write_sideset_data() is
3759  // always called following write(), then this should be a fairly safe
3760  // assumption...
3761  dof_id_type elem_id = elem_list[i + offset] - 1;
3762  unsigned int side_id = side_list[i + offset] - 1;
3763 
3764  // Sanity check: make sure that the "off by one"
3765  // assumption we used above to set 'elem_id' is valid.
3766  libmesh_error_msg_if
3767  (libmesh_map_find(libmesh_elem_num_to_exodus, cast_int<int>(elem_id)) !=
3768  cast_int<dof_id_type>(elem_list[i + offset]),
3769  "Error mapping Exodus elem id to libmesh elem id.");
3770 
3771  // Map from Exodus side ids to libmesh side ids.
3772  const auto & conv = get_conversion(mesh.elem_ptr(elem_id)->type());
3773 
3774  // Map from Exodus side ids to libmesh side ids.
3775  unsigned int converted_side_id = conv.get_side_map(side_id);
3776 
3777  // Construct a key so we can quickly see whether there is any
3778  // data for this variable in the map.
3779  BoundaryInfo::BCTuple key = std::make_tuple
3780  (elem_id,
3781  converted_side_id,
3782  ss_ids[ss]);
3783 
3784  // Find the data for this (elem,side,id) tuple. Throw an
3785  // error if not found. Then store value in vector which
3786  // will be passed to Exodus.
3787  sset_var_vals[i] = libmesh_map_find(data_map, key);
3788  } // end for (i)
3789 
3790  // As far as I can tell, there is no "concat" version of writing
3791  // sideset data, you have to call ex_put_sset_var() once per (variable,
3792  // sideset) pair.
3793  if (sset_var_vals.size() > 0)
3794  {
3795  ex_err = exII::ex_put_var
3796  (ex_id,
3797  timestep,
3798  exII::EX_SIDE_SET,
3799  var + 1, // 1-based variable index of current variable
3800  ss_ids[ss],
3801  num_sides_per_set[ss],
3802  MappedOutputVector(sset_var_vals, _single_precision).data());
3803  EX_CHECK_ERR(ex_err, "Error writing sideset vars.");
3804  }
3805  } // end for (var)
3806  } // end for (ss)
3807 
3808  // Finally, write the sideset truth table.
3809  ex_err =
3810  exII::ex_put_truth_table(ex_id,
3811  exII::EX_SIDE_SET,
3812  num_side_sets,
3813  cast_int<int>(var_names.size()),
3814  sset_var_tab.data());
3815  EX_CHECK_ERR(ex_err, "Error writing sideset var truth table.");
3816 }
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().
std::tuple< dof_id_type, unsigned short int, boundary_id_type > BCTuple
Create a list of (element_id, side_id, boundary_id) tuples for relevant sides.
std::vector< int > num_sides_per_set
void read_sideset_info()
Reads information about all of the sidesets in the ExodusII mesh file.
const boundary_id_type side_id
MeshBase & mesh
const ExodusII_IO_Helper::Conversion & get_conversion(const ElemType type) const
std::map< dof_id_type, dof_id_type > libmesh_elem_num_to_exodus
virtual const Elem * elem_ptr(const dof_id_type i) const =0
void read_sideset(int id, int offset)
Reads information about sideset id and inserts it into the global sideset array at the position offse...
processor_id_type processor_id() const
virtual ElemType type() const =0
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153
uint8_t dof_id_type
Definition: id_types.h:67

◆ write_sidesets()

void libMesh::Nemesis_IO_Helper::write_sidesets ( const MeshBase mesh)
overridevirtual

Writes the sidesets for this processor.

Reimplemented from libMesh::ExodusII_IO_Helper.

Definition at line 2082 of file nemesis_io_helper.C.

References libMesh::Elem::active_family_tree_by_side(), libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ExodusII_IO_Helper::get_conversion(), global_sideset_ids, libMesh::ExodusII_IO_Helper::libmesh_elem_num_to_exodus, mesh, libMesh::out, libMesh::ParallelObject::processor_id(), libMesh::DofObject::processor_id(), libMesh::Elem::type(), and libMesh::ExodusII_IO_Helper::verbose.

2083 {
2084  // Write the sidesets. In Nemesis, the idea is to "create space" for the global
2085  // set of boundary sidesets, but to only write sideset IDs which are local to the current
2086  // processor. This is what is done in Nemesis files created by the "loadbal" script.
2087  // See also: ExodusII_IO_Helper::write_sidesets()...
2088 
2089 
2090  // Store a map of vectors for boundary side IDs on this processor.
2091  // Use a vector of int here so it can be passed directly to Exodus.
2092  std::map<boundary_id_type, std::vector<int>> local_elem_boundary_id_lists;
2093  std::map<boundary_id_type, std::vector<int>> local_elem_boundary_id_side_lists;
2094 
2095  // FIXME: We already built this list once, we should reuse that information!
2096  std::vector<std::tuple<dof_id_type, unsigned short int, boundary_id_type>> bndry_elem_side_id_list =
2097  mesh.get_boundary_info().build_side_list();
2098 
2099  // Integer looping, skipping non-local elements
2100  for (const auto & t : bndry_elem_side_id_list)
2101  {
2102  // Get pointer to current Elem
2103  const Elem * elem = mesh.elem_ptr(std::get<0>(t));
2104 
2105  std::vector<const Elem *> family;
2106 #ifdef LIBMESH_ENABLE_AMR
2107  // We need to build up active elements if AMR is enabled and add
2108  // them to the exodus sidesets instead of the potentially inactive "parent" elements
2109  // Technically we don't need to "reset" the tree since the vector was just created.
2110  elem->active_family_tree_by_side(family, std::get<1>(t), /*reset tree=*/false);
2111 #else
2112  // If AMR is not even enabled, just push back the element itself
2113  family.push_back( elem );
2114 #endif
2115 
2116  // Loop over all the elements in the family tree, store their converted IDs
2117  // and side IDs to the map's vectors. TODO: Somehow reserve enough space for these
2118  // push_back's...
2119  for (const auto & tree_elem : family)
2120  {
2121  const dof_id_type f_id = tree_elem->id();
2122  const Elem & f = mesh.elem_ref(f_id);
2123 
2124  // If element is local, process it
2125  if (f.processor_id() == this->processor_id())
2126  {
2127  const auto & conv = get_conversion(f.type());
2128 
2129  // Use the libmesh to exodus data structure map to get the proper sideset IDs
2130  // The data structure contains the "collapsed" contiguous ids.
2131  //
2132  // We know the parent element is local, but let's be absolutely sure that all the children have been
2133  // actually mapped to Exodus IDs before we blindly try to add them...
2134  local_elem_boundary_id_lists[ std::get<2>(t) ].push_back( libmesh_map_find(libmesh_elem_num_to_exodus, f_id) );
2135  local_elem_boundary_id_side_lists[ std::get<2>(t) ].push_back(conv.get_inverse_side_map( std::get<1>(t) ));
2136  }
2137  }
2138  }
2139 
2140 
2141  // Loop over *global* sideset IDs, call the Exodus API. Note that some sidesets may be empty
2142  // for a given processor.
2143  if (global_sideset_ids.size() > 0)
2144  {
2145  NamesData names_table(global_sideset_ids.size(), MAX_STR_LENGTH);
2146 
2147  for (const auto & exodus_id : this->global_sideset_ids)
2148  {
2149  const std::string & current_ss_name =
2150  mesh.get_boundary_info().get_sideset_name
2151  (cast_int<boundary_id_type>(exodus_id));
2152 
2153  // Store this name in a data structure that will be used to
2154  // write sideset names to file.
2155  names_table.push_back_entry(current_ss_name);
2156 
2157  if (verbose)
2158  {
2159  libMesh::out << "[" << this->processor_id()
2160  << "] Writing out Exodus sideset info for ID: " << exodus_id
2161  << ", Name: " << current_ss_name
2162  << std::endl;
2163  }
2164 
2165  // Try to find this boundary ID in the local list we created
2166  if (const auto it = local_elem_boundary_id_lists.find (cast_int<boundary_id_type>(exodus_id));
2167  it == local_elem_boundary_id_lists.end())
2168  {
2169  // No sides found for this boundary ID on this processor
2170  if (verbose)
2171  libMesh::out << "[" << this->processor_id()
2172  << "] No sideset data for ID: " << exodus_id
2173  << " on this processor." << std::endl;
2174 
2175  // Call the Exodus interface to write the parameters of this side set
2176  this->ex_err = exII::ex_put_side_set_param(this->ex_id,
2177  exodus_id,
2178  0, /* No sides for this ID */
2179  0 /* No distribution factors */);
2180  EX_CHECK_ERR(this->ex_err, "Error writing sideset parameters in Nemesis");
2181 
2182  }
2183  else // Boundary ID *was* found in list
2184  {
2185  // Get reference to the vector of elem IDs
2186  const std::vector<int> & current_sideset_elem_ids = it->second;
2187 
2188  // Get reference to the vector of side IDs
2189  std::vector<int> & current_sideset_side_ids =
2190  libmesh_map_find(local_elem_boundary_id_side_lists,
2191  cast_int<boundary_id_type>(exodus_id));
2192 
2193  // Call the Exodus interface to write the parameters of this side set
2194  this->ex_err = exII::ex_put_side_set_param(this->ex_id,
2195  exodus_id,
2196  current_sideset_elem_ids.size(),
2197  0 /* No distribution factors */);
2198 
2199  EX_CHECK_ERR(this->ex_err, "Error writing sideset parameters in Nemesis");
2200 
2201  // Call Exodus interface to write the actual side IDs for this boundary ID
2202  this->ex_err = exII::ex_put_side_set(this->ex_id,
2203  exodus_id,
2204  current_sideset_elem_ids.data(),
2205  current_sideset_side_ids.data());
2206 
2207  EX_CHECK_ERR(this->ex_err, "Error writing sidesets in Nemesis");
2208  }
2209  } // end for loop over global sideset IDs
2210 
2211  // Write sideset names to file. Some of these may be blank strings
2212  // if the current processor didn't have all the sideset names for
2213  // any reason...
2214  ex_err = exII::ex_put_names(this->ex_id,
2215  exII::EX_SIDE_SET,
2216  names_table.get_char_star_star());
2217  EX_CHECK_ERR(ex_err, "Error writing sideset names");
2218 
2219  } // end if (global_sideset_ids.size() > 0)
2220 }
std::vector< int > global_sideset_ids
Containers for reading global sideset (boundary conditions) information.
MeshBase & mesh
const ExodusII_IO_Helper::Conversion & get_conversion(const ElemType type) const
std::map< dof_id_type, dof_id_type > libmesh_elem_num_to_exodus
OStreamProxy out
processor_id_type processor_id() const
uint8_t dof_id_type
Definition: id_types.h:67

◆ write_timestep()

void libMesh::ExodusII_IO_Helper::write_timestep ( int  timestep,
Real  time 
)
inherited

Writes the time for the timestep.

Definition at line 3562 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::_run_only_on_proc0, libMesh::ExodusII_IO_Helper::_single_precision, libMesh::ExodusII_IO_Helper::ex_err, libMesh::ExodusII_IO_Helper::ex_id, libMesh::ParallelObject::processor_id(), and libMesh::ExodusII_IO_Helper::update().

3563 {
3564  if ((_run_only_on_proc0) && (this->processor_id() != 0))
3565  return;
3566 
3567  if (_single_precision)
3568  {
3569  float cast_time = float(time);
3570  ex_err = exII::ex_put_time(ex_id, timestep, &cast_time);
3571  }
3572  else
3573  {
3574  double cast_time = double(time);
3575  ex_err = exII::ex_put_time(ex_id, timestep, &cast_time);
3576  }
3577  EX_CHECK_ERR(ex_err, "Error writing timestep.");
3578 
3579  this->update();
3580 }
void update()
Uses ex_update() to flush buffers to file.
processor_id_type processor_id() const

◆ write_var_names()

void libMesh::ExodusII_IO_Helper::write_var_names ( ExodusVarType  type,
const std::vector< std::string > &  names 
)
protectedinherited

Wraps calls to exII::ex_put_var_names() and exII::ex_put_var_param().

The enumeration controls whether nodal, elemental, or global variable names are read and which class members are filled in.

Definition at line 2005 of file exodusII_io_helper.C.

References libMesh::ExodusII_IO_Helper::ELEMENTAL, libMesh::ExodusII_IO_Helper::ELEMSET, libMesh::ExodusII_IO_Helper::GLOBAL, libMesh::ExodusII_IO_Helper::NODAL, libMesh::ExodusII_IO_Helper::NODESET, libMesh::ExodusII_IO_Helper::num_elem_vars, libMesh::ExodusII_IO_Helper::num_elemset_vars, libMesh::ExodusII_IO_Helper::num_global_vars, libMesh::ExodusII_IO_Helper::num_nodal_vars, libMesh::ExodusII_IO_Helper::num_nodeset_vars, libMesh::ExodusII_IO_Helper::num_sideset_vars, libMesh::ExodusII_IO_Helper::SIDESET, and libMesh::ExodusII_IO_Helper::write_var_names_impl().

Referenced by initialize_element_variables(), libMesh::ExodusII_IO_Helper::initialize_element_variables(), libMesh::ExodusII_IO_Helper::initialize_global_variables(), libMesh::ExodusII_IO_Helper::initialize_nodal_variables(), libMesh::ExodusII_IO_Helper::write_elemset_data(), libMesh::ExodusII_IO_Helper::write_nodeset_data(), and libMesh::ExodusII_IO_Helper::write_sideset_data().

2007 {
2008  switch (type)
2009  {
2010  case NODAL:
2011  this->write_var_names_impl("n", num_nodal_vars, names);
2012  break;
2013  case ELEMENTAL:
2014  this->write_var_names_impl("e", num_elem_vars, names);
2015  break;
2016  case GLOBAL:
2017  this->write_var_names_impl("g", num_global_vars, names);
2018  break;
2019  case SIDESET:
2020  {
2021  // Note: calling this function *sets* num_sideset_vars to the
2022  // number of entries in the 'names' vector, num_sideset_vars
2023  // does not already need to be set before calling this.
2024  this->write_var_names_impl("s", num_sideset_vars, names);
2025  break;
2026  }
2027  case NODESET:
2028  {
2029  this->write_var_names_impl("m", num_nodeset_vars, names);
2030  break;
2031  }
2032  case ELEMSET:
2033  {
2034  this->write_var_names_impl("t", num_elemset_vars, names);
2035  break;
2036  }
2037  default:
2038  libmesh_error_msg("Unrecognized ExodusVarType " << type);
2039  }
2040 }
void write_var_names_impl(const char *var_type, int &count, const std::vector< std::string > &names)
write_var_names() dispatches to this function.

Member Data Documentation

◆ _added_side_node_offsets

std::vector<dof_id_type> libMesh::ExodusII_IO_Helper::_added_side_node_offsets
protectedinherited

If we're adding "fake" sides to visualize SIDE_DISCONTINUOUS variables, _added_side_node_offsets[p] gives us the total solution vector offset to use on processor p+1 from the nodes on those previous ranks' sides.

Definition at line 1034 of file exodusII_io_helper.h.

Referenced by libMesh::ExodusII_IO_Helper::added_node_offset_on(), libMesh::ExodusII_IO_Helper::initialize(), and libMesh::ExodusII_IO_Helper::node_id_to_vec_id().

◆ _communicator

const Parallel::Communicator& libMesh::ParallelObject::_communicator
protectedinherited

◆ _coordinate_offset

Point libMesh::ExodusII_IO_Helper::_coordinate_offset
protectedinherited

◆ _elem_vars_initialized

bool libMesh::ExodusII_IO_Helper::_elem_vars_initialized
protectedinherited

◆ _end_elem_id

int libMesh::ExodusII_IO_Helper::_end_elem_id
protectedinherited

◆ _global_vars_initialized

bool libMesh::ExodusII_IO_Helper::_global_vars_initialized
protectedinherited

◆ _max_name_length

unsigned int libMesh::ExodusII_IO_Helper::_max_name_length
protectedinherited

◆ _nodal_vars_initialized

bool libMesh::ExodusII_IO_Helper::_nodal_vars_initialized
protectedinherited

◆ _opened_by_create

bool libMesh::ExodusII_IO_Helper::_opened_by_create
protectedinherited

◆ _run_only_on_proc0

bool libMesh::ExodusII_IO_Helper::_run_only_on_proc0
protectedinherited

◆ _single_precision

bool libMesh::ExodusII_IO_Helper::_single_precision
protectedinherited

◆ _true_node_offsets

std::vector<dof_id_type> libMesh::ExodusII_IO_Helper::_true_node_offsets
protectedinherited

If we're adding "fake" sides to visualize SIDE_DISCONTINUOUS variables, we also need to know how many real nodes from previous ranks are taking up space in a solution vector.

Definition at line 1041 of file exodusII_io_helper.h.

Referenced by libMesh::ExodusII_IO_Helper::added_node_offset_on(), libMesh::ExodusII_IO_Helper::initialize(), and libMesh::ExodusII_IO_Helper::node_id_to_vec_id().

◆ _use_mesh_dimension_instead_of_spatial_dimension

bool libMesh::ExodusII_IO_Helper::_use_mesh_dimension_instead_of_spatial_dimension
protectedinherited

◆ _write_as_dimension

unsigned libMesh::ExodusII_IO_Helper::_write_as_dimension
protectedinherited

◆ _write_hdf5

bool libMesh::ExodusII_IO_Helper::_write_hdf5
protectedinherited

◆ bex_cv_conn

std::vector<std::vector<long unsigned int> > libMesh::ExodusII_IO_Helper::bex_cv_conn
inherited

◆ bex_dense_constraint_vecs

std::vector<std::vector<std::vector<Real> > > libMesh::ExodusII_IO_Helper::bex_dense_constraint_vecs
inherited

◆ bex_num_elem_cvs

unsigned int libMesh::ExodusII_IO_Helper::bex_num_elem_cvs
inherited

◆ block_id_to_elem_connectivity

std::map<int, std::vector<int> > libMesh::Nemesis_IO_Helper::block_id_to_elem_connectivity

This is the block connectivity, i.e.

for each subdomain (block) there is an element connectivity list. This map associates the block ID to that vector.

Definition at line 447 of file nemesis_io_helper.h.

Referenced by build_element_and_node_maps(), and write_elements().

◆ block_ids

std::vector<int> libMesh::ExodusII_IO_Helper::block_ids
inherited

◆ border_elem_ids

std::set<unsigned> libMesh::Nemesis_IO_Helper::border_elem_ids
private

A set of border elem IDs for this processor.

Definition at line 641 of file nemesis_io_helper.h.

Referenced by compute_element_maps(), and compute_internal_and_border_elems_and_internal_nodes().

◆ border_node_ids

std::set<unsigned> libMesh::Nemesis_IO_Helper::border_node_ids
private

The set which will eventually contain the IDs of "border nodes".

These are nodes that lie on the boundary between one or more processors.

Definition at line 604 of file nemesis_io_helper.h.

Referenced by compute_border_node_ids(), compute_internal_and_border_elems_and_internal_nodes(), and compute_node_maps().

◆ connect

std::vector<int> libMesh::ExodusII_IO_Helper::connect
inherited

◆ current_filename

std::string libMesh::ExodusII_IO_Helper::current_filename
inherited

◆ edge_block_ids

std::vector<int> libMesh::ExodusII_IO_Helper::edge_block_ids
inherited

◆ elem_cmap_elem_cnts

std::vector<int> libMesh::Nemesis_IO_Helper::elem_cmap_elem_cnts

◆ elem_cmap_elem_ids

std::vector<std::vector<int> > libMesh::Nemesis_IO_Helper::elem_cmap_elem_ids

3 vectors of vectors for storing element communication IDs for this processor.

There will be num_elem_cmaps rows, row i will have elem_cmap_elem_cnts[i] entries. To be used with Nemesis::ne_get_elem_cmap().

Definition at line 569 of file nemesis_io_helper.h.

Referenced by compute_elem_communication_maps(), get_elem_cmap(), and initialize().

◆ elem_cmap_ids

std::vector<int> libMesh::Nemesis_IO_Helper::elem_cmap_ids

◆ elem_cmap_proc_ids

std::vector<std::vector<int> > libMesh::Nemesis_IO_Helper::elem_cmap_proc_ids

Definition at line 571 of file nemesis_io_helper.h.

Referenced by compute_elem_communication_maps(), get_elem_cmap(), and initialize().

◆ elem_cmap_side_ids

std::vector<std::vector<int> > libMesh::Nemesis_IO_Helper::elem_cmap_side_ids

Definition at line 570 of file nemesis_io_helper.h.

Referenced by compute_elem_communication_maps(), get_elem_cmap(), and initialize().

◆ elem_list

std::vector<int> libMesh::ExodusII_IO_Helper::elem_list
inherited

◆ elem_mapb

std::vector<int> libMesh::Nemesis_IO_Helper::elem_mapb

Vector which stores border element IDs.

Will have length num_border_elems. To be used with Nemesis::ne_get_elem_map().

Definition at line 514 of file nemesis_io_helper.h.

Referenced by compute_element_maps(), get_elem_map(), and initialize().

◆ elem_mapi

std::vector<int> libMesh::Nemesis_IO_Helper::elem_mapi

Vector which stores internal element IDs.

Will have length num_internal_elems. To be used with Nemesis::ne_get_elem_map().

Definition at line 507 of file nemesis_io_helper.h.

Referenced by compute_element_maps(), get_elem_map(), and initialize().

◆ elem_num_map

std::vector<int> libMesh::ExodusII_IO_Helper::elem_num_map
inherited

◆ elem_type

std::vector<char> libMesh::ExodusII_IO_Helper::elem_type
inherited

◆ elem_var_names

std::vector<std::string> libMesh::ExodusII_IO_Helper::elem_var_names
inherited

◆ elem_var_values

std::vector<Real> libMesh::ExodusII_IO_Helper::elem_var_values
inherited

Definition at line 874 of file exodusII_io_helper.h.

◆ elemset_id_list

std::vector<int> libMesh::ExodusII_IO_Helper::elemset_id_list
inherited

◆ elemset_ids

std::vector<int> libMesh::ExodusII_IO_Helper::elemset_ids
inherited

◆ elemset_list

std::vector<int> libMesh::ExodusII_IO_Helper::elemset_list
inherited

◆ elemset_var_names

std::vector<std::string> libMesh::ExodusII_IO_Helper::elemset_var_names
inherited

◆ ex_err

int libMesh::ExodusII_IO_Helper::ex_err
inherited

Definition at line 675 of file exodusII_io_helper.h.

Referenced by libMesh::ExodusII_IO_Helper::close(), libMesh::ExodusII_IO_Helper::create(), libMesh::ExodusII_IO_Helper::initialize(), initialize_element_variables(), libMesh::ExodusII_IO_Helper::initialize_element_variables(), libMesh::ExodusII_IO_Helper::open(), libMesh::ExodusII_IO_Helper::read_all_nodesets(), libMesh::ExodusII_IO_Helper::read_and_store_header_info(), libMesh::ExodusII_IO_Helper::read_bex_cv_blocks(), libMesh::ExodusII_IO_Helper::read_block_info(), libMesh::ExodusII_IO_Helper::read_edge_blocks(), libMesh::ExodusII_IO_Helper::read_elem_in_block(), libMesh::ExodusII_IO_Helper::read_elem_num_map(), libMesh::ExodusII_IO_Helper::read_elemental_var_values(), libMesh::ExodusII_IO_Helper::read_elemset(), libMesh::ExodusII_IO_Helper::read_elemset_data(), libMesh::ExodusII_IO_Helper::read_elemset_info(), libMesh::ExodusII_IO_Helper::read_global_values(), libMesh::ExodusII_IO_Helper::read_nodal_var_values(), libMesh::ExodusII_IO_Helper::read_node_num_map(), libMesh::ExodusII_IO_Helper::read_nodes(), read_nodeset(), libMesh::ExodusII_IO_Helper::read_nodeset_data(), libMesh::ExodusII_IO_Helper::read_nodeset_info(), libMesh::ExodusII_IO_Helper::read_qa_records(), libMesh::ExodusII_IO_Helper::read_sideset(), libMesh::ExodusII_IO_Helper::read_sideset_data(), libMesh::ExodusII_IO_Helper::read_sideset_info(), libMesh::ExodusII_IO_Helper::read_time_steps(), libMesh::ExodusII_IO_Helper::read_var_names_impl(), libMesh::ExodusII_IO_Helper::update(), write_element_values(), libMesh::ExodusII_IO_Helper::write_element_values(), libMesh::ExodusII_IO_Helper::write_element_values_element_major(), write_elements(), libMesh::ExodusII_IO_Helper::write_elements(), libMesh::ExodusII_IO_Helper::write_elemset_data(), libMesh::ExodusII_IO_Helper::write_elemsets(), write_exodus_initialization_info(), libMesh::ExodusII_IO_Helper::write_global_values(), libMesh::ExodusII_IO_Helper::write_information_records(), write_nodal_coordinates(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::ExodusII_IO_Helper::write_nodal_values(), libMesh::ExodusII_IO_Helper::write_nodeset_data(), write_nodesets(), libMesh::ExodusII_IO_Helper::write_nodesets(), libMesh::ExodusII_IO_Helper::write_sideset_data(), write_sidesets(), libMesh::ExodusII_IO_Helper::write_sidesets(), libMesh::ExodusII_IO_Helper::write_timestep(), libMesh::ExodusII_IO_Helper::write_var_names_impl(), and ~Nemesis_IO_Helper().

◆ ex_id

int libMesh::ExodusII_IO_Helper::ex_id
inherited

Definition at line 672 of file exodusII_io_helper.h.

Referenced by libMesh::ExodusII_IO_Helper::close(), libMesh::ExodusII_IO_Helper::create(), get_cmap_params(), get_eb_info_global(), get_elem_cmap(), get_elem_map(), get_init_global(), get_init_info(), get_loadbal_param(), get_node_cmap(), get_node_map(), get_ns_param_global(), get_ss_param_global(), libMesh::ExodusII_IO_Helper::initialize(), initialize_element_variables(), libMesh::ExodusII_IO_Helper::initialize_element_variables(), libMesh::ExodusII_IO_Helper::open(), put_cmap_params(), put_eb_info_global(), put_elem_cmap(), put_elem_map(), put_init_global(), put_init_info(), put_loadbal_param(), put_node_cmap(), put_node_map(), put_ns_param_global(), put_ss_param_global(), libMesh::ExodusII_IO_Helper::read_all_nodesets(), libMesh::ExodusII_IO_Helper::read_and_store_header_info(), libMesh::ExodusII_IO_Helper::read_bex_cv_blocks(), libMesh::ExodusII_IO_Helper::read_block_info(), libMesh::ExodusII_IO_Helper::read_edge_blocks(), libMesh::ExodusII_IO_Helper::read_elem_in_block(), libMesh::ExodusII_IO_Helper::read_elem_num_map(), libMesh::ExodusII_IO_Helper::read_elemental_var_values(), libMesh::ExodusII_IO_Helper::read_elemset(), libMesh::ExodusII_IO_Helper::read_elemset_data(), libMesh::ExodusII_IO_Helper::read_elemset_info(), libMesh::ExodusII_IO_Helper::read_global_values(), libMesh::ExodusII_IO_Helper::read_header(), libMesh::ExodusII_IO_Helper::read_nodal_var_values(), libMesh::ExodusII_IO_Helper::read_node_num_map(), libMesh::ExodusII_IO_Helper::read_nodes(), read_nodeset(), libMesh::ExodusII_IO_Helper::read_nodeset_data(), libMesh::ExodusII_IO_Helper::read_nodeset_info(), libMesh::ExodusII_IO_Helper::read_qa_records(), libMesh::ExodusII_IO_Helper::read_sideset(), libMesh::ExodusII_IO_Helper::read_sideset_data(), libMesh::ExodusII_IO_Helper::read_sideset_info(), libMesh::ExodusII_IO_Helper::read_time_steps(), libMesh::ExodusII_IO_Helper::read_var_names_impl(), libMesh::ExodusII_IO_Helper::update(), write_element_values(), libMesh::ExodusII_IO_Helper::write_element_values(), libMesh::ExodusII_IO_Helper::write_element_values_element_major(), write_elements(), libMesh::ExodusII_IO_Helper::write_elements(), libMesh::ExodusII_IO_Helper::write_elemset_data(), libMesh::ExodusII_IO_Helper::write_elemsets(), write_exodus_initialization_info(), libMesh::ExodusII_IO_Helper::write_global_values(), libMesh::ExodusII_IO_Helper::write_information_records(), write_nodal_coordinates(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::ExodusII_IO_Helper::write_nodal_values(), libMesh::ExodusII_IO_Helper::write_nodeset_data(), write_nodesets(), libMesh::ExodusII_IO_Helper::write_nodesets(), libMesh::ExodusII_IO_Helper::write_sideset_data(), write_sidesets(), libMesh::ExodusII_IO_Helper::write_sidesets(), libMesh::ExodusII_IO_Helper::write_timestep(), libMesh::ExodusII_IO_Helper::write_var_names_impl(), and ~Nemesis_IO_Helper().

◆ exodus_elem_num_to_libmesh

std::vector<int> libMesh::ExodusII_IO_Helper::exodus_elem_num_to_libmesh
inherited

Definition at line 843 of file exodusII_io_helper.h.

Referenced by build_element_and_node_maps(), and write_elements().

◆ exodus_node_num_to_libmesh

std::vector<int> libMesh::ExodusII_IO_Helper::exodus_node_num_to_libmesh
inherited

◆ ftype

char libMesh::Nemesis_IO_Helper::ftype

The type of file to be written.

Either 's', for a scalar load-balance file, or 'p' for a parallel file. To be used with Nemesis::ne_get_init_info().

Definition at line 396 of file nemesis_io_helper.h.

Referenced by get_init_info().

◆ global_elem_blk_cnts

std::vector<int> libMesh::Nemesis_IO_Helper::global_elem_blk_cnts

◆ global_elem_blk_ids

std::vector<int> libMesh::Nemesis_IO_Helper::global_elem_blk_ids

Read the global element block IDs and counts.

These vectors will eventually have num_elem_blks_global entries. To be used with Nemesis::ne_get_eb_info_global().

Definition at line 430 of file nemesis_io_helper.h.

Referenced by compute_num_global_elem_blocks(), get_eb_info_global(), initialize(), initialize_element_variables(), write_element_values(), and write_elements().

◆ global_nodeset_ids

std::vector<int> libMesh::Nemesis_IO_Helper::global_nodeset_ids

Containers for reading global nodeset information.

One vector entry per nodeset. Each vector will eventually have num_node_sets_global entries, and will be used in calls to Nemesis::ne_get_ns_param_global().

It's an error to call ne_get_ns_param_global when num_node_sets_global==0

Definition at line 420 of file nemesis_io_helper.h.

Referenced by compute_num_global_nodesets(), get_ns_param_global(), initialize(), put_ns_param_global(), write_exodus_initialization_info(), and write_nodesets().

◆ global_sideset_ids

std::vector<int> libMesh::Nemesis_IO_Helper::global_sideset_ids

Containers for reading global sideset (boundary conditions) information.

Each vector will eventually have num_side_sets_global entries, and be used in calls to Nemesis::ne_get_ss_param_global().

It's an error to call ne_get_ss_param_global when num_side_sets_global==0

Definition at line 408 of file nemesis_io_helper.h.

Referenced by compute_num_global_sidesets(), get_ss_param_global(), initialize(), put_ss_param_global(), write_exodus_initialization_info(), and write_sidesets().

◆ global_var_names

std::vector<std::string> libMesh::ExodusII_IO_Helper::global_var_names
inherited

◆ header_info

ExodusHeaderInfo libMesh::ExodusII_IO_Helper::header_info
inherited

◆ id_list

std::vector<int> libMesh::ExodusII_IO_Helper::id_list
inherited

◆ id_to_block_names

std::map<int, std::string> libMesh::ExodusII_IO_Helper::id_to_block_names
inherited

◆ id_to_edge_block_names

std::map<int, std::string> libMesh::ExodusII_IO_Helper::id_to_edge_block_names
inherited

◆ id_to_elemset_names

std::map<int, std::string> libMesh::ExodusII_IO_Helper::id_to_elemset_names
inherited

◆ id_to_ns_names

std::map<int, std::string> libMesh::ExodusII_IO_Helper::id_to_ns_names
inherited

◆ id_to_ss_names

std::map<int, std::string> libMesh::ExodusII_IO_Helper::id_to_ss_names
inherited

◆ internal_elem_ids

std::set<unsigned> libMesh::Nemesis_IO_Helper::internal_elem_ids
private

A set of internal elem IDs for this processor.

Definition at line 636 of file nemesis_io_helper.h.

Referenced by compute_element_maps(), and compute_internal_and_border_elems_and_internal_nodes().

◆ internal_node_ids

std::set<unsigned> libMesh::Nemesis_IO_Helper::internal_node_ids
private

A set of internal node IDs for this processor.

Definition at line 631 of file nemesis_io_helper.h.

Referenced by compute_internal_and_border_elems_and_internal_nodes(), and compute_node_maps().

◆ libmesh_elem_num_to_exodus

std::map<dof_id_type, dof_id_type> libMesh::ExodusII_IO_Helper::libmesh_elem_num_to_exodus
inherited

◆ libmesh_node_num_to_exodus

std::map<dof_id_type, dof_id_type> libMesh::ExodusII_IO_Helper::libmesh_node_num_to_exodus
inherited

◆ local_subdomain_counts

std::map<subdomain_id_type, unsigned> libMesh::Nemesis_IO_Helper::local_subdomain_counts
private

This map keeps track of the number of elements in each subdomain (block) for this processor.

Definition at line 598 of file nemesis_io_helper.h.

Referenced by build_element_and_node_maps(), and compute_num_global_elem_blocks().

◆ nemesis_err_flag

int libMesh::Nemesis_IO_Helper::nemesis_err_flag

◆ nodal_var_names

std::vector<std::string> libMesh::ExodusII_IO_Helper::nodal_var_names
inherited

◆ nodal_var_values

std::map<dof_id_type, Real> libMesh::ExodusII_IO_Helper::nodal_var_values
inherited

◆ node_cmap_ids

std::vector<int> libMesh::Nemesis_IO_Helper::node_cmap_ids

Vectors for storing the communication map parameters.

Each will eventually have length num_node_cmaps OR num_elem_cmaps as appropriate. For use with Nemesis::ne_get_cmap_params().

Definition at line 546 of file nemesis_io_helper.h.

Referenced by compute_communication_map_parameters(), compute_node_communication_maps(), get_cmap_params(), get_node_cmap(), initialize(), and put_node_cmap().

◆ node_cmap_node_cnts

std::vector<int> libMesh::Nemesis_IO_Helper::node_cmap_node_cnts

◆ node_cmap_node_ids

std::vector<std::vector<int> > libMesh::Nemesis_IO_Helper::node_cmap_node_ids

2 vectors of vectors for storing the node communication IDs for this processor.

There will be num_node_cmaps rows, row i will have node_cmap_node_cnts[i] entries. To be used with Nemesis::ne_get_node_cmap().

Remark: node_cmap_proc_ids is a vector, all entries of which are = node_cmap_ids[i] Not sure what the point of that is...

Definition at line 560 of file nemesis_io_helper.h.

Referenced by compute_node_communication_maps(), get_node_cmap(), and initialize().

◆ node_cmap_proc_ids

std::vector<std::vector<int> > libMesh::Nemesis_IO_Helper::node_cmap_proc_ids

Definition at line 561 of file nemesis_io_helper.h.

Referenced by compute_node_communication_maps(), get_node_cmap(), and initialize().

◆ node_list

std::vector<int> libMesh::Nemesis_IO_Helper::node_list

Definition at line 399 of file nemesis_io_helper.h.

Referenced by read_nodeset().

◆ node_mapb

std::vector<int> libMesh::Nemesis_IO_Helper::node_mapb

Vector which stores border node IDs.

Will have length num_border_nodes. To be used with Nemesis::ne_get_node_map().

Definition at line 530 of file nemesis_io_helper.h.

Referenced by compute_node_maps(), get_node_map(), and initialize().

◆ node_mape

std::vector<int> libMesh::Nemesis_IO_Helper::node_mape

Vector which stores external node IDs.

Will have length num_external_nodes. To be used with Nemesis::ne_get_node_map().

Definition at line 537 of file nemesis_io_helper.h.

Referenced by compute_node_maps(), get_node_map(), and initialize().

◆ node_mapi

std::vector<int> libMesh::Nemesis_IO_Helper::node_mapi

Vector which stores internal node IDs.

Will have length num_internal_nodes. To be used with Nemesis::ne_get_node_map().

Definition at line 523 of file nemesis_io_helper.h.

Referenced by compute_node_maps(), get_node_map(), and initialize().

◆ node_num_map

std::vector<int> libMesh::ExodusII_IO_Helper::node_num_map
inherited

◆ node_sets_dist_fact

std::vector<Real> libMesh::ExodusII_IO_Helper::node_sets_dist_fact
inherited

◆ node_sets_dist_index

std::vector<int> libMesh::ExodusII_IO_Helper::node_sets_dist_index
inherited

◆ node_sets_node_index

std::vector<int> libMesh::ExodusII_IO_Helper::node_sets_node_index
inherited

◆ node_sets_node_list

std::vector<int> libMesh::ExodusII_IO_Helper::node_sets_node_list
inherited

◆ nodes_attached_to_local_elems

std::set<int> libMesh::Nemesis_IO_Helper::nodes_attached_to_local_elems

libMesh numbered node ids attached to local elems.

Definition at line 436 of file nemesis_io_helper.h.

Referenced by build_element_and_node_maps(), and compute_internal_and_border_elems_and_internal_nodes().

◆ nodeset_ids

std::vector<int> libMesh::ExodusII_IO_Helper::nodeset_ids
inherited

◆ nodeset_var_names

std::vector<std::string> libMesh::ExodusII_IO_Helper::nodeset_var_names
inherited

◆ num_attr

int libMesh::ExodusII_IO_Helper::num_attr
inherited

◆ num_border_elems

int libMesh::Nemesis_IO_Helper::num_border_elems

The number of border FEM elements.

Elements local to this processor but whose FEM nodes reside on other processors as well. To be used with the Nemesis::ne_get_loadbal_param() routine.

Definition at line 484 of file nemesis_io_helper.h.

Referenced by compute_internal_and_border_elems_and_internal_nodes(), get_elem_map(), get_loadbal_param(), and initialize().

◆ num_border_nodes

int libMesh::Nemesis_IO_Helper::num_border_nodes

The number of FEM nodes local to a processor but residing in an element which also has FEM nodes on other processors.

To be used with the Nemesis::ne_get_loadbal_param() routine.

Definition at line 464 of file nemesis_io_helper.h.

Referenced by compute_border_node_ids(), compute_internal_and_border_elems_and_internal_nodes(), get_loadbal_param(), get_node_map(), and initialize().

◆ num_df_per_set

std::vector<int> libMesh::ExodusII_IO_Helper::num_df_per_set
inherited

◆ num_dim

int& libMesh::ExodusII_IO_Helper::num_dim
inherited

◆ num_edge

int& libMesh::ExodusII_IO_Helper::num_edge
inherited

Definition at line 700 of file exodusII_io_helper.h.

Referenced by libMesh::ExodusII_IO_Helper::initialize().

◆ num_edge_blk

int& libMesh::ExodusII_IO_Helper::num_edge_blk
inherited

◆ num_elem

int& libMesh::ExodusII_IO_Helper::num_elem
inherited

◆ num_elem_all_elemsets

int libMesh::ExodusII_IO_Helper::num_elem_all_elemsets
inherited

◆ num_elem_all_sidesets

int libMesh::ExodusII_IO_Helper::num_elem_all_sidesets
inherited

◆ num_elem_blk

int& libMesh::ExodusII_IO_Helper::num_elem_blk
inherited

◆ num_elem_blks_global

int libMesh::Nemesis_IO_Helper::num_elem_blks_global

◆ num_elem_cmaps

int libMesh::Nemesis_IO_Helper::num_elem_cmaps

The number of elemental communication maps for this processor.

(One per neighboring proc?) To be used with the Nemesis::ne_get_loadbal_param() routine.

Definition at line 498 of file nemesis_io_helper.h.

Referenced by compute_communication_map_parameters(), compute_elem_communication_maps(), compute_internal_and_border_elems_and_internal_nodes(), get_cmap_params(), get_elem_cmap(), get_loadbal_param(), and initialize().

◆ num_elem_df_per_set

std::vector<int> libMesh::ExodusII_IO_Helper::num_elem_df_per_set
inherited

◆ num_elem_sets

int& libMesh::ExodusII_IO_Helper::num_elem_sets
inherited

◆ num_elem_this_blk

int libMesh::ExodusII_IO_Helper::num_elem_this_blk
inherited

◆ num_elem_vars

int libMesh::ExodusII_IO_Helper::num_elem_vars
inherited

◆ num_elems_global

int libMesh::Nemesis_IO_Helper::num_elems_global

Definition at line 373 of file nemesis_io_helper.h.

Referenced by get_init_global().

◆ num_elems_per_set

std::vector<int> libMesh::ExodusII_IO_Helper::num_elems_per_set
inherited

◆ num_elemset_vars

int libMesh::ExodusII_IO_Helper::num_elemset_vars
inherited

◆ num_external_nodes

int libMesh::Nemesis_IO_Helper::num_external_nodes

The number of FEM nodes that reside on another processor but whose element partially resides on the current processor.

To be used with the Nemesis::ne_get_loadbal_param() routine.

Definition at line 471 of file nemesis_io_helper.h.

Referenced by get_loadbal_param(), get_node_map(), and initialize().

◆ num_global_node_counts

std::vector<int> libMesh::Nemesis_IO_Helper::num_global_node_counts

◆ num_global_node_df_counts

std::vector<int> libMesh::Nemesis_IO_Helper::num_global_node_df_counts

Definition at line 422 of file nemesis_io_helper.h.

Referenced by get_ns_param_global(), and initialize().

◆ num_global_side_counts

std::vector<int> libMesh::Nemesis_IO_Helper::num_global_side_counts

◆ num_global_side_df_counts

std::vector<int> libMesh::Nemesis_IO_Helper::num_global_side_df_counts

Definition at line 410 of file nemesis_io_helper.h.

Referenced by get_ss_param_global(), and initialize().

◆ num_global_vars

int libMesh::ExodusII_IO_Helper::num_global_vars
inherited

◆ num_internal_elems

int libMesh::Nemesis_IO_Helper::num_internal_elems

The number of internal FEM elements.

Elements local to this processor. To be used with the Nemesis::ne_get_loadbal_param() routine.

Definition at line 477 of file nemesis_io_helper.h.

Referenced by compute_internal_and_border_elems_and_internal_nodes(), get_elem_map(), get_loadbal_param(), and initialize().

◆ num_internal_nodes

int libMesh::Nemesis_IO_Helper::num_internal_nodes

To be used with the Nemesis::ne_get_loadbal_param() routine.

The number of FEM nodes contained in FEM elements wholly owned by the current processor. To be used with the Nemesis::ne_get_loadbal_param() routine.

Definition at line 457 of file nemesis_io_helper.h.

Referenced by compute_internal_and_border_elems_and_internal_nodes(), get_loadbal_param(), get_node_map(), and initialize().

◆ num_nodal_vars

int libMesh::ExodusII_IO_Helper::num_nodal_vars
inherited

◆ num_node_cmaps

int libMesh::Nemesis_IO_Helper::num_node_cmaps

The number of nodal communication maps for this processor.

(One per neighboring proc?) To be used with the Nemesis::ne_get_loadbal_param() routine.

Definition at line 491 of file nemesis_io_helper.h.

Referenced by compute_border_node_ids(), compute_communication_map_parameters(), compute_node_communication_maps(), get_cmap_params(), get_loadbal_param(), get_node_cmap(), and initialize().

◆ num_node_df_per_set

std::vector<int> libMesh::ExodusII_IO_Helper::num_node_df_per_set
inherited

◆ num_node_sets

int& libMesh::ExodusII_IO_Helper::num_node_sets
inherited

◆ num_node_sets_global

int libMesh::Nemesis_IO_Helper::num_node_sets_global

◆ num_nodes

int& libMesh::ExodusII_IO_Helper::num_nodes
inherited

◆ num_nodes_global

int libMesh::Nemesis_IO_Helper::num_nodes_global

Global initial information.

The names are self-explanatory for the most part. Used with Nemesis::ne_get_init_global().

Definition at line 372 of file nemesis_io_helper.h.

Referenced by get_init_global().

◆ num_nodes_per_elem

int libMesh::ExodusII_IO_Helper::num_nodes_per_elem
inherited

◆ num_nodes_per_set

std::vector<int> libMesh::ExodusII_IO_Helper::num_nodes_per_set
inherited

◆ num_nodeset_vars

int libMesh::ExodusII_IO_Helper::num_nodeset_vars
inherited

◆ num_proc

int libMesh::Nemesis_IO_Helper::num_proc

The number of processors for which the NEMESIS I file was created.

To be used with Nemesis::ne_get_init_info().

Definition at line 382 of file nemesis_io_helper.h.

Referenced by get_init_info().

◆ num_proc_in_file

int libMesh::Nemesis_IO_Helper::num_proc_in_file

The number of processors for which the NEMESIS I file stores information.

This is generally equal to 1 (1 CPU/file) at least for the splitting Derek gave us. To be used with Nemesis::ne_get_init_info().

Definition at line 389 of file nemesis_io_helper.h.

Referenced by get_init_info().

◆ num_side_sets

int& libMesh::ExodusII_IO_Helper::num_side_sets
inherited

◆ num_side_sets_global

int libMesh::Nemesis_IO_Helper::num_side_sets_global

◆ num_sides_per_set

std::vector<int> libMesh::ExodusII_IO_Helper::num_sides_per_set
inherited

◆ num_sideset_vars

int libMesh::ExodusII_IO_Helper::num_sideset_vars
inherited

◆ num_time_steps

int libMesh::ExodusII_IO_Helper::num_time_steps
inherited

◆ opened_for_reading

bool libMesh::ExodusII_IO_Helper::opened_for_reading
inherited

◆ opened_for_writing

bool libMesh::ExodusII_IO_Helper::opened_for_writing
inherited

◆ proc_border_elem_sets

std::map<unsigned, std::set<std::pair<unsigned,unsigned> > > libMesh::Nemesis_IO_Helper::proc_border_elem_sets
private

Map between processor ID and (element,side) pairs bordering that processor ID.

Definition at line 621 of file nemesis_io_helper.h.

Referenced by compute_communication_map_parameters(), compute_elem_communication_maps(), and compute_internal_and_border_elems_and_internal_nodes().

◆ proc_nodes_touched_intersections

std::map<unsigned, std::set<unsigned> > libMesh::Nemesis_IO_Helper::proc_nodes_touched_intersections
private

Another map to store sets of intersections with each other processor (other than ourself, of course).

A node which appears in one of these vectors belongs to element owned by at least this processor and one other.

Definition at line 611 of file nemesis_io_helper.h.

Referenced by compute_border_node_ids(), compute_communication_map_parameters(), and compute_node_communication_maps().

◆ set_unique_ids_from_maps

bool libMesh::ExodusII_IO_Helper::set_unique_ids_from_maps
inherited

◆ side_list

std::vector<int> libMesh::ExodusII_IO_Helper::side_list
inherited

◆ sideset_var_names

std::vector<std::string> libMesh::ExodusII_IO_Helper::sideset_var_names
inherited

◆ ss_ids

std::vector<int> libMesh::ExodusII_IO_Helper::ss_ids
inherited

◆ subdomain_map

std::map<subdomain_id_type, std::vector<dof_id_type> > libMesh::Nemesis_IO_Helper::subdomain_map

Map of subdomains to element numbers.

Definition at line 441 of file nemesis_io_helper.h.

Referenced by build_element_and_node_maps(), write_element_values(), and write_elements().

◆ time_steps

std::vector<Real> libMesh::ExodusII_IO_Helper::time_steps
inherited

Definition at line 854 of file exodusII_io_helper.h.

Referenced by libMesh::ExodusII_IO_Helper::read_time_steps().

◆ title

std::vector<char>& libMesh::ExodusII_IO_Helper::title
inherited

◆ verbose

bool libMesh::ExodusII_IO_Helper::verbose
inherited

◆ w

std::vector<Real> libMesh::ExodusII_IO_Helper::w
inherited

Definition at line 825 of file exodusII_io_helper.h.

Referenced by libMesh::ExodusII_IO_Helper::read_nodes().

◆ write_complex_abs

bool libMesh::Nemesis_IO_Helper::write_complex_abs

By default, when complex numbers are enabled, for each variable we write out three values: the real part, "r_u" the imaginary part, "i_u", and the complex modulus, a_u := sqrt(r_u*r_u + i_u*i_u), which is also the value returned by std::abs(std::complex).

Since the modulus is not an independent quantity, we can set this flag to false and save some file space by not writing out.

Definition at line 582 of file nemesis_io_helper.h.

Referenced by write_element_values().

◆ x

std::vector<Real> libMesh::ExodusII_IO_Helper::x
inherited

◆ y

std::vector<Real> libMesh::ExodusII_IO_Helper::y
inherited

◆ z

std::vector<Real> libMesh::ExodusII_IO_Helper::z
inherited

The documentation for this class was generated from the following files: