43 std::string local_file_name (
const unsigned int processor_id,
44 const std::string &
name)
46 std::string basename(
name);
49 if (basename.size() - basename.rfind(
".bz2") == 4)
51 basename.erase(basename.end()-4, basename.end());
52 std::sprintf(buf,
"%s.%04u.bz2", basename.c_str(), processor_id);
54 else if (basename.size() - basename.rfind(
".gz") == 3)
56 basename.erase(basename.end()-3, basename.end());
57 std::sprintf(buf,
"%s.%04u.gz", basename.c_str(), processor_id);
60 std::sprintf(buf,
"%s.%04u", basename.c_str(), processor_id);
62 return std::string(buf);
71 template <
typename InValType>
73 const unsigned int read_flags,
74 bool partition_agnostic)
77 if (
name.find(
".xdr") != std::string::npos)
79 this->
read(name, mode, read_flags, partition_agnostic);
81 #ifdef LIBMESH_ENABLE_AMR 89 template <
typename InValType>
92 const unsigned int read_flags,
93 bool partition_agnostic)
103 this->_read_impl<InValType> (
name, mode, read_flags, partition_agnostic);
109 libMesh::out <<
"\n*********************************************************************\n" 110 <<
"READING THE FILE \"" <<
name <<
"\" FAILED.\n" 111 <<
"It is possible this file contains infinite element information,\n" 112 <<
"but the version string does not contain \" with infinite elements\"\n" 113 <<
"Let's try this again, but looking for infinite element information...\n" 114 <<
"*********************************************************************\n" 125 libMesh::out <<
"\n*********************************************************************\n" 126 <<
"Well, at least we tried!\n" 128 <<
"*********************************************************************\n" 134 #ifdef LIBMESH_ENABLE_AMR 142 template <
typename InValType>
145 const unsigned int read_flags,
146 bool partition_agnostic)
218 bool read_parallel_files =
false;
220 std::vector<std::pair<std::string, System *>> xda_systems;
230 std::string version =
"legacy";
231 if (!read_legacy_format)
238 const std::string libMesh_label =
"libMesh-";
239 std::string::size_type lm_pos = version.find(libMesh_label);
240 if (lm_pos==std::string::npos)
251 std::istringstream iss(version.substr(lm_pos + libMesh_label.size()));
252 int ver_major = 0, ver_minor = 0, ver_patch = 0;
254 iss >> ver_major >> dot >> ver_minor >> dot >> ver_patch;
255 io.
set_version(LIBMESH_VERSION_ID(ver_major, ver_minor, ver_patch));
258 read_parallel_files = (version.rfind(
" parallel") < version.size());
265 if (!(version.rfind(
" with infinite elements") < version.size()))
266 version +=
" with infinite elements";
270 libmesh_deprecated();
272 START_LOG(
"read()",
"EquationSystems");
276 unsigned int n_sys=0;
280 for (
unsigned int sys=0; sys<n_sys; sys++)
284 std::string sys_name;
290 std::string sys_type;
303 read_additional_data,
306 xda_systems.push_back(std::make_pair(sys_name, &new_system));
330 if (!read_legacy_format && partition_agnostic)
336 Xdr local_io (read_parallel_files ? local_file_name(this->
processor_id(),name) :
"", mode);
338 for (
auto & pr : xda_systems)
339 if (read_legacy_format)
341 libmesh_deprecated();
342 #ifdef LIBMESH_ENABLE_DEPRECATED 343 pr.second->read_legacy_data (io, read_additional_data);
347 if (read_parallel_files)
348 pr.second->read_parallel_data<InValType> (local_io, read_additional_data);
350 pr.second->read_serialized_data<InValType> (io, read_additional_data);
354 if (!read_legacy_format && partition_agnostic)
358 STOP_LOG(
"read()",
"EquationSystems");
367 const unsigned int write_flags,
368 bool partition_agnostic)
const 371 if (
name.find(
".xdr") != std::string::npos)
373 this->
write(name, mode, write_flags, partition_agnostic);
380 const unsigned int write_flags,
381 bool partition_agnostic)
const 449 if (partition_agnostic)
461 const bool write_parallel_files =
480 LOG_SCOPE(
"write()",
"EquationSystems");
484 unsigned int n_sys = 0;
486 if (!pr.second->hide_output())
490 io.
set_version(LIBMESH_VERSION_ID(LIBMESH_MAJOR_VERSION,
491 LIBMESH_MINOR_VERSION,
492 LIBMESH_MICRO_VERSION));
504 if (write_parallel_files) version +=
" parallel";
506 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 507 version +=
" with infinite elements";
509 io.
data (version,
"# File Format Identifier");
513 io.
data (n_sys,
"# No. of Equation Systems");
518 if (pr.second->hide_output())
continue;
523 const unsigned int sys_num = pr.second->number();
524 std::string sys_name = pr.first;
526 comment =
"# Name, System No. ";
527 std::sprintf(buf,
"%u", sys_num);
530 io.
data (sys_name, comment.c_str());
536 const unsigned int sys_num = pr.second->number();
537 std::string sys_type = pr.second->system_type();
539 comment =
"# Type, System No. ";
540 std::sprintf(buf,
"%u", sys_num);
543 io.
data (sys_type, comment.c_str());
548 pr.second->write_header (io, version, write_additional_data);
557 Xdr local_io (write_parallel_files ? local_file_name(this->
processor_id(),name) :
"", mode);
562 if (pr.second->hide_output())
continue;
565 if (write_parallel_files)
566 pr.second->write_parallel_data (local_io,write_additional_data);
568 pr.second->write_serialized_data (io,write_additional_data);
576 if (partition_agnostic)
577 const_cast<MeshBase &
>(
_mesh).fix_broken_node_and_element_numbering();
584 template void EquationSystems::read<Number> (
const std::string &
name,
const unsigned int read_flags,
bool partition_agnostic);
585 template void EquationSystems::read<Number> (
const std::string &
name,
const XdrMODE mode,
const unsigned int read_flags,
bool partition_agnostic);
586 template void EquationSystems::_read_impl<Number> (
const std::string &
name,
const XdrMODE mode,
const unsigned int read_flags,
bool partition_agnostic);
587 #ifdef LIBMESH_USE_COMPLEX_NUMBERS 588 template void EquationSystems::read<Real> (
const std::string &
name,
const unsigned int read_flags,
bool partition_agnostic);
589 template void EquationSystems::read<Real> (
const std::string &
name,
const XdrMODE mode,
const unsigned int read_flags,
bool partition_agnostic);
590 template void EquationSystems::_read_impl<Real> (
const std::string &
name,
const XdrMODE mode,
const unsigned int read_flags,
bool partition_agnostic);
std::string name(const ElemQuality q)
void data(T &a, const char *comment="")
const T_sys & get_system(const std::string &name) const
const Parallel::Communicator & comm() const
void clean_refinement_flags()
virtual void fix_broken_node_and_element_numbering()=0
void read(const std::string &name, const XdrMODE, const unsigned int read_flags=(READ_HEADER|READ_DATA), bool partition_agnostic=true)
void write(const std::string &name, const XdrMODE, const unsigned int write_flags=(WRITE_DATA), bool partition_agnostic=true) const
void set_basic_system_only()
Responsible for mesh refinement algorithms and data.
std::string get_io_compatibility_version()
void read_header(Xdr &io, const std::string &version, const bool read_header=true, const bool read_additional_data=true, const bool read_legacy_format=false)
Manages consistently variables, degrees of freedom, and coefficient vectors.
virtual System & add_system(const std::string &system_type, const std::string &name)
C++ interface for the XDR (eXternal Data Representation) format.
void set_version(int ver)
const MeshBase & get_mesh() const
void _read_impl(const std::string &name, const XdrMODE, const unsigned int read_flags, bool partition_agnostic=true)
processor_id_type processor_id() const
OStreamProxy out(std::cout)
void broadcast(T &data, const unsigned int root_id=0) const
std::map< std::string, System * > _systems