libMesh
checkpoint_io.h
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2024 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 
19 
20 #ifndef LIBMESH_CHECKPOINT_IO_H
21 #define LIBMESH_CHECKPOINT_IO_H
22 
23 
24 // Local includes
25 #include "libmesh/compare_elems_by_level.h"
26 #include "libmesh/mesh_input.h"
27 #include "libmesh/mesh_output.h"
28 #include "libmesh/mesh_communication.h"
29 #include "libmesh/parallel_object.h"
30 
31 // C++ includes
32 #include <string>
33 #include <vector>
34 
35 namespace libMesh
36 {
37 // Forward declarations
38 class Xdr;
39 class CheckpointIO;
40 
48 std::unique_ptr<CheckpointIO> split_mesh(MeshBase & mesh, processor_id_type nsplits);
49 
61 class CheckpointIO : public MeshInput<MeshBase>,
62  public MeshOutput<MeshBase>,
63  public ParallelObject
64 {
65 public:
66  // The size used for encoding all id types in this file
68 
69  // The size type used to read header sizes (meta data information)
70  typedef uint64_t header_id_type;
71 
79  explicit
80  CheckpointIO (MeshBase &, const bool=false);
81 
89  explicit
90  CheckpointIO (const MeshBase &, const bool=false);
91 
95  virtual ~CheckpointIO ();
96 
103  virtual void read (const std::string & input_name) override;
104 
118  virtual void write (const std::string & name) override;
119 
141  static void cleanup(const std::string & input_name, processor_id_type n_procs);
142 
146  bool binary() const { return _binary; }
147  bool & binary() { return _binary; }
148 
152  bool parallel() const { return _parallel; }
153  bool & parallel() { return _parallel; }
154 
158  const std::string & version () const { return _version; }
159  std::string & version () { return _version; }
160 
168  bool version_at_least_1_5() const;
169 
180  const std::vector<processor_id_type> & current_processor_ids() const { return _my_processor_ids; }
181  std::vector<processor_id_type> & current_processor_ids() { return _my_processor_ids; }
182 
195 
196 private:
197  //---------------------------------------------------------------------------
198  // Write Implementation
199 
203  void write_subdomain_names(Xdr & io) const;
204 
208  void write_connectivity (Xdr & io,
209  const std::set<const Elem *, CompareElemIdsByLevel> & elements) const;
210 
214  void write_remote_elem (Xdr & io,
215  const std::set<const Elem *, CompareElemIdsByLevel> & elements) const;
216 
220  void write_nodes (Xdr & io,
221  const connected_node_set_type & nodeset) const;
222 
226  void write_bcs (Xdr & io,
227  const std::set<const Elem *, CompareElemIdsByLevel> & elements,
228  const std::vector<std::tuple<dof_id_type, unsigned short int, boundary_id_type>> & bc_triples) const;
229 
233  void write_nodesets (Xdr & io,
234  const connected_node_set_type & nodeset,
235  const std::vector<std::tuple<dof_id_type, boundary_id_type>> & bc_tuples) const;
236 
240  void write_bc_names (Xdr & io, const BoundaryInfo & info, bool is_sideset) const;
241 
242 
243  //---------------------------------------------------------------------------
244  // Read Implementation
245 
251  template <typename file_id_type>
252  file_id_type read_header(const std::string & name);
253 
257  template <typename file_id_type>
258  void read_subfile(Xdr & io, bool expect_all_remote);
259 
263  template <typename file_id_type>
264  void read_subdomain_names(Xdr & io);
265 
269  template <typename file_id_type>
270  void read_connectivity (Xdr & io);
271 
279  template <typename file_id_type>
280  void read_remote_elem (Xdr & io, bool expect_all_remote);
281 
285  template <typename file_id_type>
286  void read_nodes (Xdr & io);
287 
291  template <typename file_id_type>
292  void read_bcs (Xdr & io);
293 
297  template <typename file_id_type>
298  void read_nodesets (Xdr & io);
299 
303  template <typename file_id_type>
304  void read_bc_names(Xdr & io, BoundaryInfo & info, bool is_sideset);
305 
309  template <typename file_id_type>
311  (Xdr & io,
312  std::vector<std::string> & node_integer_names,
313  std::vector<std::string> & elem_integer_names);
314 
325 
326  processor_id_type select_split_config(const std::string & input_name, header_id_type & data_size);
327 
328  bool _binary;
329  bool _parallel;
330  std::string _version;
331 
332  // The processor ids to write
333  std::vector<processor_id_type> _my_processor_ids;
334 
335  // The largest processor id to write
337 };
338 
339 
340 } // namespace libMesh
341 
342 #endif // LIBMESH_CHECKPOINT_IO_H
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
The CheckpointIO class can be used to write simplified restart files that can be used to restart simu...
Definition: checkpoint_io.h:61
virtual void write(const std::string &name) override
This method implements writing a mesh to a specified file.
const std::string & version() const
Get/Set the version string.
const processor_id_type & current_n_processors() const
Get/Set the n_processors to use.
void write_remote_elem(Xdr &io, const std::set< const Elem *, CompareElemIdsByLevel > &elements) const
Write the remote_elem neighbor and child links for part of a mesh.
void write_connectivity(Xdr &io, const std::set< const Elem *, CompareElemIdsByLevel > &elements) const
Write the connectivity for part of a mesh.
MPI_Info info
The definition of the const_element_iterator struct.
Definition: mesh_base.h:2121
void write_nodes(Xdr &io, const connected_node_set_type &nodeset) const
Write the nodal locations for part of a mesh.
virtual void read(const std::string &input_name) override
This method implements reading a mesh from a specified file.
uint64_t largest_id_type
Definition: id_types.h:148
MeshBase & mesh
This class defines an abstract interface for Mesh output.
Definition: mesh_output.h:53
void write_bcs(Xdr &io, const std::set< const Elem *, CompareElemIdsByLevel > &elements, const std::vector< std::tuple< dof_id_type, unsigned short int, boundary_id_type >> &bc_triples) const
Write the side boundary conditions for part of a mesh.
void read_bc_names(Xdr &io, BoundaryInfo &info, bool is_sideset)
Read boundary names information (sideset and nodeset)
The libMesh namespace provides an interface to certain functionality in the library.
void read_remote_elem(Xdr &io, bool expect_all_remote)
Read the remote_elem neighbor and child links for a parallel, distributed mesh.
bool parallel() const
Get/Set the flag indicating if we should read/write binary.
unsigned int n_active_levels_in(MeshBase::const_element_iterator begin, MeshBase::const_element_iterator end) const
processor_id_type select_split_config(const std::string &input_name, header_id_type &data_size)
uint8_t processor_id_type
Definition: id_types.h:104
This is the MeshBase class.
Definition: mesh_base.h:74
const std::vector< processor_id_type > & current_processor_ids() const
Get/Set the processor id or processor ids to use.
std::vector< processor_id_type > _my_processor_ids
uint8_t processor_id_type
std::vector< processor_id_type > & current_processor_ids()
std::string & version()
void write_subdomain_names(Xdr &io) const
Write subdomain name information.
This class defines an abstract interface for Mesh input.
Definition: mesh_base.h:56
processor_id_type _my_n_processors
CheckpointIO(MeshBase &, const bool=false)
Constructor.
The BoundaryInfo class contains information relevant to boundary conditions including storing faces...
Definition: boundary_info.h:57
static void cleanup(const std::string &input_name, processor_id_type n_procs)
Used to remove a checkpoint directory and its corresponding files.
void write_nodesets(Xdr &io, const connected_node_set_type &nodeset, const std::vector< std::tuple< dof_id_type, boundary_id_type >> &bc_tuples) const
Write the nodal boundary conditions for part of a mesh.
void write_bc_names(Xdr &io, const BoundaryInfo &info, bool is_sideset) const
Write boundary names information (sideset and nodeset)
An object whose state is distributed along a set of processors.
file_id_type read_header(const std::string &name)
Read header data on processor 0, then broadcast.
This class implements a C++ interface to the XDR (eXternal Data Representation) format.
Definition: xdr_cxx.h:67
std::set< const Node * > connected_node_set_type
void read_subdomain_names(Xdr &io)
Read subdomain name information.
largest_id_type xdr_id_type
Definition: checkpoint_io.h:67
bool version_at_least_1_5() const
void read_bcs(Xdr &io)
Read the boundary conditions for a parallel, distributed mesh.
std::unique_ptr< CheckpointIO > split_mesh(MeshBase &mesh, processor_id_type nsplits)
split_mesh takes the given initialized/opened mesh and partitions it into nsplits pieces or chunks...
void read_subfile(Xdr &io, bool expect_all_remote)
Read a non-header file.
void read_nodesets(Xdr &io)
Read the nodeset conditions for a parallel, distributed mesh.
void read_nodes(Xdr &io)
Read the nodal locations for a parallel, distributed mesh.
void read_integers_names(Xdr &io, std::vector< std::string > &node_integer_names, std::vector< std::string > &elem_integer_names)
Read extra integers names information.
bool binary() const
Get/Set the flag indicating if we should read/write binary.
processor_id_type & current_n_processors()
void read_connectivity(Xdr &io)
Read the connectivity for a parallel, distributed mesh.
virtual ~CheckpointIO()
Destructor.