Line data Source code
1 : // The libMesh Finite Element Library. 2 : // Copyright (C) 2002-2025 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 328 : class ExodusHeaderInfo 38 : { 39 : public: 40 : // All special functions can be defaulted for this simple class. 41 1304 : ExodusHeaderInfo () = default; 42 : ExodusHeaderInfo (ExodusHeaderInfo &&) = default; 43 : ExodusHeaderInfo (const ExodusHeaderInfo &) = default; 44 : ExodusHeaderInfo & operator= (const ExodusHeaderInfo &) = default; 45 2672 : ExodusHeaderInfo & operator= (ExodusHeaderInfo &&) = default; 46 705 : ~ExodusHeaderInfo() = default; 47 : 48 : /** 49 : * Broadcasts data from processor 0 to other procs using the 50 : * provided Communicator. 51 : */ 52 71 : void broadcast(const Parallel::Communicator & comm) 53 : { 54 : // broadcast vector<char> separately 55 71 : comm.broadcast(title); 56 : 57 : // Pack individual integers into vector 58 : std::vector<int> buffer = 59 83 : {num_dim, num_elem, num_elem_blk, num_node_sets, 60 71 : num_side_sets, num_elem_sets, num_edge_blk, num_edge}; 61 : 62 : // broadcast integers 63 71 : comm.broadcast(buffer); 64 : 65 : // unpack 66 2 : unsigned int ctr = 0; 67 71 : num_dim = buffer[ctr++]; 68 71 : num_elem = buffer[ctr++]; 69 71 : num_elem_blk = buffer[ctr++]; 70 71 : num_node_sets = buffer[ctr++]; 71 71 : num_side_sets = buffer[ctr++]; 72 71 : num_elem_sets = buffer[ctr++]; 73 71 : num_edge_blk = buffer[ctr++]; 74 71 : num_edge = buffer[ctr++]; 75 71 : } 76 : 77 : std::vector<char> title; 78 : int num_dim; 79 : int num_nodes; 80 : int num_elem; 81 : int num_elem_blk; 82 : int num_node_sets; 83 : int num_side_sets; 84 : int num_elem_sets; 85 : int num_edge_blk; 86 : int num_edge; 87 : }; 88 : 89 : } // namespace libMesh 90 : 91 : #endif