Line data Source code
1 : // The libMesh Finite Element Library. 2 : // Copyright (C) 2002-2026 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner 3 : 4 : // This library is free software; you can redistribute it and/or 5 : // modify it under the terms of the GNU Lesser General Public 6 : // License as published by the Free Software Foundation; either 7 : // version 2.1 of the License, or (at your option) any later version. 8 : 9 : // This library is distributed in the hope that it will be useful, 10 : // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 : // Lesser General Public License for more details. 13 : 14 : // You should have received a copy of the GNU Lesser General Public 15 : // License along with this library; if not, write to the Free Software 16 : // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 : 18 : #ifndef LIBMESH_EXODUS_HEADER_INFO_H 19 : #define LIBMESH_EXODUS_HEADER_INFO_H 20 : 21 : // TIMPI includes 22 : #include "timpi/communicator.h" 23 : #include "timpi/parallel_implementation.h" 24 : 25 : // C++ includes 26 : #include <vector> 27 : 28 : namespace libMesh 29 : { 30 : 31 : /** 32 : * This class is used as both an external data structure for passing 33 : * around Exodus file header information, and for storing information 34 : * internally in ExodusII_IO_Helper. It can't really be defined in 35 : * either of those existing headers, so it has its own header... 36 : */ 37 356 : class ExodusHeaderInfo 38 : { 39 : public: 40 : // All special functions can be defaulted for this simple class. 41 1358 : ExodusHeaderInfo () = default; 42 : ExodusHeaderInfo (ExodusHeaderInfo &&) = default; 43 : ExodusHeaderInfo (const ExodusHeaderInfo &) = default; 44 : ExodusHeaderInfo & operator= (const ExodusHeaderInfo &) = default; 45 328 : ExodusHeaderInfo & operator= (ExodusHeaderInfo &&) = default; 46 715 : ~ExodusHeaderInfo() = default; 47 : 48 : /** 49 : * Broadcasts data from processor 0 to other procs using the 50 : * provided Communicator. 51 : */ 52 21 : void broadcast(const Parallel::Communicator & comm) 53 : { 54 : // broadcast vector<char> separately 55 21 : comm.broadcast(title); 56 : 57 : // Pack individual integers into vector 58 : std::vector<int> buffer = 59 57 : {num_dim, num_elem, num_elem_blk, num_node_sets, 60 57 : num_side_sets, num_elem_sets, num_edge_blk, num_edge, 61 21 : num_face_blk, num_face}; 62 : 63 : // broadcast integers 64 21 : comm.broadcast(buffer); 65 : 66 : // unpack 67 6 : unsigned int ctr = 0; 68 21 : num_dim = buffer[ctr++]; 69 21 : num_elem = buffer[ctr++]; 70 21 : num_elem_blk = buffer[ctr++]; 71 21 : num_node_sets = buffer[ctr++]; 72 21 : num_side_sets = buffer[ctr++]; 73 21 : num_elem_sets = buffer[ctr++]; 74 21 : num_edge_blk = buffer[ctr++]; 75 21 : num_edge = buffer[ctr++]; 76 21 : num_face_blk = buffer[ctr++]; 77 21 : num_face = buffer[ctr++]; 78 21 : } 79 : 80 : std::vector<char> title; 81 : int num_dim; 82 : int num_nodes; 83 : int num_elem; 84 : int num_elem_blk; 85 : int num_node_sets; 86 : int num_side_sets; 87 : int num_elem_sets; 88 : int num_edge_blk; 89 : int num_edge; 90 : int num_face_blk; 91 : int num_face; 92 : }; 93 : 94 : } // namespace libMesh 95 : 96 : #endif