libMesh
Loading...
Searching...
No Matches
Public Member Functions | Protected Member Functions | Protected Attributes | Private Attributes | List of all members
libMesh::NameBasedIO Class Reference

This class supports simple reads and writes in any libMesh-supported format, by dispatching to one of the other I/O classes based on filename. More...

#include <namebased_io.h>

Inheritance diagram for libMesh::NameBasedIO:
[legend]

Public Member Functions

 NameBasedIO (const MeshBase &)
 Constructor.
 
 NameBasedIO (MeshBase &)
 Constructor.
 
virtual void read (const std::string &mesh_file) override
 This method implements reading a mesh from a specified file.
 
virtual void write (const std::string &mesh_file) override
 This method implements writing a mesh to a specified file.
 
virtual void write_equation_systems (const std::string &filename, const EquationSystems &es, const std::set< std::string > *system_names=nullptr) override
 This method implements writing a mesh with data to a specified file where the data is taken from the EquationSystems object.
 
virtual void write_nodal_data (const std::string &, const std::vector< Number > &, const std::vector< std::string > &) override
 This method implements writing a mesh with nodal data to a specified file where the nodal data and variable names are provided.
 
bool is_parallel_file_format (std::string_view filename)
 
bool is_parallel_format () const
 Returns true iff this mesh file format and input class are parallelized, so that all processors can read their share of the data at once.
 
virtual void write_discontinuous_equation_systems (const std::string &, const EquationSystems &, const std::set< std::string > *system_names=nullptr)
 This method implements writing a mesh with discontinuous data to a specified file where the data is taken from the EquationSystems object.
 
virtual void write_nodal_data (const std::string &, const NumericVector< Number > &, const std::vector< std::string > &)
 This method may be overridden by "parallel" output formats for writing nodal data.
 
virtual void write_nodal_data (const std::string &, const EquationSystems &, const std::set< std::string > *)
 This method should be overridden by "parallel" output formats for writing nodal data.
 
virtual void write_nodal_data_discontinuous (const std::string &, const std::vector< Number > &, const std::vector< std::string > &)
 This method implements writing a mesh with discontinuous data to a specified file where the nodal data and variables names are provided.
 
unsigned intascii_precision ()
 Return/set the precision to use when writing ASCII files.
 

Protected Member Functions

MeshBasemesh ()
 
void set_n_partitions (unsigned int n_parts)
 Sets the number of partitions in the mesh.
 
void skip_comment_lines (std::istream &in, const char comment_start)
 Reads input from in, skipping all the lines that start with the character comment_start.
 
const MeshBasemesh () const
 
virtual bool get_add_sides ()
 

Protected Attributes

std::vector< bool > elems_of_dimension
 A vector of bools describing what dimension elements have been encountered when reading a mesh.
 
const bool _is_parallel_format
 Flag specifying whether this format is parallel-capable.
 
const bool _serial_only_needed_on_proc_0
 Flag specifying whether this format can be written by only serializing the mesh to processor zero.
 

Private Attributes

MeshBase_obj
 A pointer to a non-const object object.
 
const bool _is_parallel_format
 Flag specifying whether this format is parallel-capable.
 
unsigned int _ascii_precision
 Precision to use when writing ASCII files.
 

Detailed Description

This class supports simple reads and writes in any libMesh-supported format, by dispatching to one of the other I/O classes based on filename.

Other I/O classes may have more advanced features that are not accessible via this interface.

Author
Roy H. Stogner
Date
2015

Definition at line 44 of file namebased_io.h.

Constructor & Destructor Documentation

◆ NameBasedIO() [1/2]

libMesh::NameBasedIO::NameBasedIO ( const MeshBase mesh)
inlineexplicit

Constructor.

Takes a reference to a constant mesh object. This constructor will only allow us to write the mesh.

Definition at line 110 of file namebased_io.h.

110 :
112{
113}
template class LIBMESH_EXPORT MeshOutput< MeshBase >

◆ NameBasedIO() [2/2]

libMesh::NameBasedIO::NameBasedIO ( MeshBase mesh)
inlineexplicit

Constructor.

Takes a writable reference to a mesh object. This constructor is required to let us read in a mesh.

Definition at line 116 of file namebased_io.h.

116 :
117 MeshInput<MeshBase> (mesh),
119{
120}

Member Function Documentation

◆ ascii_precision()

unsigned int & libMesh::MeshOutput< MeshBase >::ascii_precision ( )
inlineinherited

Return/set the precision to use when writing ASCII files.

By default we use numeric_limits<Real>::max_digits10, which should be enough to write out to ASCII and get the exact same Real back when reading in.

Definition at line 160 of file mesh_output.h.

270{
271 return _ascii_precision;
272}
unsigned int _ascii_precision
Precision to use when writing ASCII files.

◆ get_add_sides()

virtual bool libMesh::MeshOutput< MeshBase >::get_add_sides ( )
inlineprotectedvirtualinherited
Returns
Whether or not added sides are expected to be output, to plot SIDE_DISCONTINUOUS data. Subclasses should override this if they are capable of plotting such data.

Reimplemented in libMesh::ExodusII_IO.

Definition at line 176 of file mesh_output.h.

176{ return false; }

◆ is_parallel_file_format()

bool libMesh::NameBasedIO::is_parallel_file_format ( std::string_view  filename)

Definition at line 574 of file namebased_io.C.

575{
576 using Utility::contains;
577 using Utility::ends_with;
578 return (contains(name, ".xda") || contains(name, ".xdr") ||
579 ends_with(name, ".nem") || ends_with(name, ".n") ||
580 contains(name, ".cp"));
581}
bool contains(std::string_view superstring, std::string_view substring)
Look for a substring within a string.
Definition utility.C:205
bool ends_with(std::string_view superstring, std::string_view suffix)
Look for a substring at the very end of a string.
Definition utility.C:213

References libMesh::Utility::contains(), and libMesh::Utility::ends_with().

Referenced by read(), and write().

◆ is_parallel_format()

bool libMesh::MeshInput< MeshBase >::is_parallel_format ( ) const
inlineinherited

Returns true iff this mesh file format and input class are parallelized, so that all processors can read their share of the data at once.

Definition at line 87 of file mesh_input.h.

87{ return this->_is_parallel_format; }
const bool _is_parallel_format
Flag specifying whether this format is parallel-capable.
Definition mesh_input.h:130

◆ mesh() [1/2]

MeshBase & libMesh::MeshInput< MeshBase >::mesh ( )
inlineprotectedinherited
Returns
The object as a writable reference.

Definition at line 94 of file mesh_input.h.

179{
180 libmesh_error_msg_if(_obj == nullptr, "ERROR: _obj should not be nullptr!");
181 return *_obj;
182}
MeshBase * _obj
A pointer to a non-const object object.
Definition mesh_input.h:123

◆ mesh() [2/2]

const MeshBase & libMesh::MeshOutput< MeshBase >::mesh ( ) const
inlineprotectedinherited
Returns
The object as a read-only reference.

Definition at line 168 of file mesh_output.h.

260{
261 libmesh_assert(_obj);
262 return *_obj;
263}
const MeshBase *const _obj
A pointer to a constant object.
libmesh_assert(ctx)

◆ read()

void libMesh::NameBasedIO::read ( const std::string &  mesh_file)
overridevirtual

This method implements reading a mesh from a specified file.

Implements libMesh::MeshInput< MeshBase >.

Definition at line 69 of file namebased_io.C.

70{
71 MeshBase & mymesh = MeshInput<MeshBase>::mesh();
72
73 const std::string_view basename = Utility::basename_of(name);
74
77
78 // See if the file exists. Perform this check on all processors
79 // so that the code is terminated properly in the case that the
80 // file does not exist.
81
82 // For Nemesis files, the name we try to read will have suffixes
83 // identifying processor rank
84 if (ends_with(basename, ".nem") || ends_with(basename, ".n"))
85 {
86 std::ostringstream full_name;
87
88 // Find the length of a string which represents the highest processor ID
89 full_name << (mymesh.n_processors());
90 int field_width = cast_int<int>(full_name.str().size());
91
92 // reset the string stream
93 full_name.str("");
94
95 // And build up the full filename
96 full_name << name
97 << '.' << mymesh.n_processors()
98 << '.' << std::setfill('0') << std::setw(field_width) << mymesh.processor_id();
99
100 std::ifstream in (full_name.str().c_str());
101 libmesh_error_msg_if(!in.good(), "ERROR: cannot locate specified file:\n\t" << full_name.str());
102 }
103 else if (contains(basename, ".cp")) {} // Do error checking in the reader
104 else
105 {
106 std::ifstream in (name.c_str());
107 libmesh_error_msg_if(!in.good(), "ERROR: cannot locate specified file:\n\t" << name);
108 }
109
110 // Look for parallel formats first
111 if (is_parallel_file_format(basename))
112 {
113 // no need to handle bz2 files here -- the Xdr class does that.
114 if (contains(basename, ".xda") ||
115 contains(basename, ".xdr"))
116 {
117 XdrIO xdr_io(mymesh);
118
119 // .xda* ==> bzip2/gzip/ASCII flavors
120 if (contains(basename, ".xda"))
121 {
122 xdr_io.binary() = false;
123 xdr_io.read (name);
124 }
125 else // .xdr* ==> true binary XDR file
126 {
127 xdr_io.binary() = true;
128 xdr_io.read (name);
129 }
130
131 // The xdr_io object gets constructed with legacy() == false.
132 // if legacy() == true then it means that a legacy file was detected and
133 // thus processor 0 performed the read. We therefore need to broadcast the
134 // mesh. Further, for this flavor of mesh solution data ordering is tied
135 // to the node ordering, so we better not reorder the nodes!
136 if (xdr_io.legacy())
137 {
138 mymesh.allow_renumbering(false);
139 MeshCommunication().broadcast(mymesh);
140 }
141
142 // libHilbert-enabled libMesh builds should construct files
143 // with a canonical node ordering, which libHilbert-enabled
144 // builds will be able to read in again regardless of any
145 // renumbering. So in that case we're free to renumber.
146 // However, if either the writer or the reader of this file
147 // don't have libHilbert, then we'll have to skip
148 // renumbering because we need the numbering to remain
149 // consistent with any solution file we read in next.
150#ifdef LIBMESH_HAVE_LIBHILBERT
151 // if (!xdr_io.libhilbert_ordering())
152 // skip_renumber_nodes_and_elements = true;
153#else
154 mymesh.allow_renumbering(false);
155#endif
156 }
157 else if (contains(basename, ".nem") ||
158 contains(basename, ".n"))
159 Nemesis_IO(mymesh).read (name);
160 else if (contains(basename, ".cp"))
161 {
162 if (contains(basename, ".cpa"))
163 CheckpointIO(mymesh, false).read(name);
164 else
165 CheckpointIO(mymesh, true).read(name);
166 }
167 }
168
169 // Serial mesh formats
170 else
171 {
172 // Read the file based on extension. Only processor 0
173 // needs to read the mesh. It will then broadcast it and
174 // the other processors will pick it up
175 if (mymesh.processor_id() == 0)
176 {
177 LOG_SCOPE("read()", "NameBasedIO");
178
179 std::ostringstream pid_suffix;
180 pid_suffix << '_' << getpid();
181 // Nasty hack for reading/writing zipped files
182 std::string new_name = name;
183 if (ends_with(name, ".bz2"))
184 {
185#ifdef LIBMESH_HAVE_BZIP
186 new_name.erase(new_name.end() - 4, new_name.end());
187 new_name += pid_suffix.str();
188 std::string system_string = "bunzip2 -f -k -c ";
189 system_string += name + " > " + new_name;
190 LOG_SCOPE("system(bunzip2)", "NameBasedIO");
191 if (std::system(system_string.c_str()))
192 libmesh_file_error(system_string);
193#else
194 libmesh_error_msg("ERROR: need bzip2/bunzip2 to open .bz2 file " << name);
195#endif
196 }
197 else if (ends_with(name, ".xz"))
198 {
199#ifdef LIBMESH_HAVE_XZ
200 new_name.erase(new_name.end() - 3, new_name.end());
201 new_name += pid_suffix.str();
202 std::string system_string = "xz -f -d -k -c ";
203 system_string += name + " > " + new_name;
204 LOG_SCOPE("system(xz -d)", "XdrIO");
205 if (std::system(system_string.c_str()))
206 libmesh_file_error(system_string);
207#else
208 libmesh_error_msg("ERROR: need xz to open .xz file " << name);
209#endif
210 }
211
212 if (contains(basename, ".mat"))
213 MatlabIO(mymesh).read(new_name);
214
215 else if (contains(basename, ".ucd"))
216 UCDIO(mymesh).read (new_name);
217
218 else if (contains(basename, ".off") ||
219 contains(basename, ".ogl") ||
220 contains(basename, ".oogl"))
221 OFFIO(mymesh).read (new_name);
222
223 else if (contains(basename, ".unv"))
224 UNVIO(mymesh).read (new_name);
225
226 else if (contains(basename, ".node") ||
227 contains(basename, ".ele"))
228 TetGenIO(mymesh).read (new_name);
229
230 else if (contains(basename, ".exd") ||
231 contains(basename, ".exo") ||
232 contains(basename, ".e"))
233 ExodusII_IO(mymesh).read (new_name);
234
235 else if (contains(basename, ".msh"))
236 GmshIO(mymesh).read (new_name);
237
238 else if (contains(basename, ".gmv"))
239 GMVIO(mymesh).read (new_name);
240
241 else if (contains(basename, ".stl"))
242 STLIO(mymesh).read (new_name);
243
244 else if (contains(basename, ".pvtu") ||
245 contains(basename, ".vtu"))
246 VTKIO(mymesh).read(new_name);
247
248 else if (contains(basename, ".inp"))
249 AbaqusIO(mymesh).read(new_name);
250
251 else if (contains(basename, ".bext") ||
252 contains(basename, ".bxt"))
253 DynaIO(mymesh).read (new_name);
254
255 else if (contains(basename, ".bez"))
256 DynaIO(mymesh, false).read (new_name);
257
258 else
259 {
260 libmesh_error_msg(" ERROR: Unrecognized file extension: " \
261 << name \
262 << "\n I understand the following:\n\n" \
263 << " *.bext -- Bezier files in DYNA format\n" \
264 << " *.bez -- Bezier DYNA files, omit spline nodes\n" \
265 << " *.bxt -- Bezier files in DYNA format\n" \
266 << " *.cpa -- libMesh Checkpoint ASCII format\n" \
267 << " *.cpr -- libMesh Checkpoint binary format\n" \
268 << " *.e -- Sandia's ExodusII format\n" \
269 << " *.exo -- Sandia's ExodusII format\n" \
270 << " *.gmv -- LANL's General Mesh Viewer format\n" \
271 << " *.inp -- Abaqus .inp format\n" \
272 << " *.mat -- Matlab triangular ASCII file\n" \
273 << " *.n -- Sandia's Nemesis format\n" \
274 << " *.nem -- Sandia's Nemesis format\n" \
275 << " *.off -- OOGL OFF surface format\n" \
276 << " *.ogl -- OOGL OFF surface format\n" \
277 << " *.oogl -- OOGL OFF surface format\n" \
278 << " *.pvtu -- Paraview VTK format\n" \
279 << " *.stl -- STereoLithography triangulation format\n" \
280 << " *.ucd -- AVS's ASCII UCD format\n" \
281 << " *.unv -- I-deas Universal format\n" \
282 << " *.vtu -- Paraview VTK format\n" \
283 << " *.xda -- libMesh ASCII format\n" \
284 << " *.xdr -- libMesh binary format\n" \
285 << " *.gz -- any above format gzipped\n" \
286 << " *.bz2 -- any above format bzip2'ed\n" \
287 << " *.xz -- any above format xzipped\n" \
288 );
289 }
290
291 // If we temporarily decompressed a file, remove the
292 // uncompressed version
293 if (ends_with(basename, ".bz2"))
294 std::remove(new_name.c_str());
295 if (ends_with(basename, ".xz"))
296 std::remove(new_name.c_str());
297 }
298
299 // Send the mesh & bcs (which are now only on processor 0) to the other
300 // processors
301 MeshCommunication().broadcast (mymesh);
302 }
303}
bool is_parallel_file_format(std::string_view filename)
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
std::string_view basename_of(const std::string &fullname)
Definition utility.C:108

References libMesh::MeshBase::allow_renumbering(), libMesh::Utility::basename_of(), libMesh::XdrIO::binary(), libMesh::MeshCommunication::broadcast(), libMesh::Utility::contains(), libMesh::Utility::ends_with(), is_parallel_file_format(), libMesh::XdrIO::legacy(), libMesh::MeshInput< MT >::mesh(), libMesh::ParallelObject::n_processors(), libMesh::ParallelObject::processor_id(), libMesh::TetGenIO::read(), libMesh::UCDIO::read(), libMesh::UNVIO::read(), libMesh::VTKIO::read(), libMesh::XdrIO::read(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::GMVIO::read(), libMesh::STLIO::read(), libMesh::AbaqusIO::read(), libMesh::DynaIO::read(), libMesh::ExodusII_IO::read(), libMesh::GmshIO::read(), libMesh::MatlabIO::read(), and libMesh::OFFIO::read().

Referenced by libMesh::UnstructuredMesh::read().

◆ set_n_partitions()

void libMesh::MeshInput< MeshBase >::set_n_partitions ( unsigned int  n_parts)
inlineprotectedinherited

Sets the number of partitions in the mesh.

Typically this gets done by the partitioner, but some parallel file formats begin "pre-partitioned".

Definition at line 101 of file mesh_input.h.

101{ this->mesh().set_n_partitions() = n_parts; }
MeshBase & mesh

◆ skip_comment_lines()

void libMesh::MeshInput< MeshBase >::skip_comment_lines ( std::istream &  in,
const char  comment_start 
)
protectedinherited

Reads input from in, skipping all the lines that start with the character comment_start.

Definition at line 113 of file mesh_input.h.

189{
190 char c, line[256];
191
192 while (in.get(c), c==comment_start)
193 in.getline (line, 255);
194
195 // put back first character of
196 // first non-comment line
197 in.putback (c);
198}

◆ write()

void libMesh::NameBasedIO::write ( const std::string &  mesh_file)
overridevirtual

This method implements writing a mesh to a specified file.

Implements libMesh::MeshOutput< MeshBase >.

Definition at line 306 of file namebased_io.C.

307{
308 const MeshBase & mymesh = MeshOutput<MeshBase>::mesh();
309
310 const std::string_view basename = Utility::basename_of(name);
311
312 using Utility::contains;
313 using Utility::ends_with;
314
315 // parallel formats are special -- they may choose to write
316 // separate files, let's not try to handle the zipping here.
317 if (is_parallel_file_format(basename))
318 {
319 // no need to handle bz2 files here -- the Xdr class does that.
320 if (contains(basename, ".xda"))
321 XdrIO(mymesh).write(name);
322
323 else if (contains(basename, ".xdr"))
324 XdrIO(mymesh,true).write(name);
325
326 else if (contains(basename, ".nem") ||
327 contains(basename, ".n"))
328 Nemesis_IO(mymesh).write(name);
329
330 else if (contains(basename, ".cpa"))
331 CheckpointIO(mymesh,false).write(name);
332
333 else if (contains(basename, ".cpr"))
334 CheckpointIO(mymesh,true).write(name);
335
336 else
337 libmesh_error_msg("Couldn't deduce filetype for " << name);
338 }
339
340 // serial file formats
341 else
342 {
343 // Nasty hack for reading/writing zipped files
344 std::string new_name = name;
345 int pid_0 = 0;
346 if (mymesh.processor_id() == 0)
347 pid_0 = getpid();
348 mymesh.comm().broadcast(pid_0);
349 std::ostringstream pid_suffix;
350 pid_suffix << '_' << pid_0;
351
352 if (ends_with(name, ".bz2"))
353 {
354 new_name.erase(new_name.end() - 4, new_name.end());
355 new_name += pid_suffix.str();
356 }
357 else if (ends_with(name, ".xz"))
358 {
359 new_name.erase(new_name.end() - 3, new_name.end());
360 new_name += pid_suffix.str();
361 }
362
363 // New scope so that io will close before we try to zip the file
364 {
365 // Write the file based on extension
366 if (contains(basename, ".dat"))
367 TecplotIO(mymesh).write (new_name);
368
369 else if (contains(basename, ".plt"))
370 TecplotIO(mymesh,true).write (new_name);
371
372 else if (contains(basename, ".ucd"))
373 UCDIO (mymesh).write (new_name);
374
375 else if (contains(basename, ".gmv"))
376 if (mymesh.n_partitions() > 1)
377 GMVIO(mymesh).write (new_name);
378 else
379 {
380 GMVIO io(mymesh);
381 io.partitioning() = false;
382 io.write (new_name);
383 }
384
385 else if (contains(basename, ".exd") ||
386 contains(basename, ".exo") ||
387 contains(basename, ".e"))
388 ExodusII_IO(mymesh).write(new_name);
389
390 else if (contains(basename, ".unv"))
391 UNVIO(mymesh).write (new_name);
392
393 else if (contains(basename, ".mesh"))
394 MEDITIO(mymesh).write (new_name);
395
396 else if (contains(basename, ".poly"))
397 TetGenIO(mymesh).write (new_name);
398
399 else if (contains(basename, ".msh"))
400 GmshIO(mymesh).write (new_name);
401
402 else if (contains(basename, ".fro"))
403 FroIO(mymesh).write (new_name);
404
405 else if (contains(basename, ".pvtu"))
406 VTKIO(mymesh).write (name);
407
408 else if (contains(basename, ".stl"))
409 STLIO(mymesh).write (new_name);
410
411 else
412 {
414 << " ERROR: Unrecognized file extension: " << name
415 << "\n I understand the following:\n\n"
416 << " *.cpa -- libMesh ASCII checkpoint format\n"
417 << " *.cpr -- libMesh binary checkpoint format,\n"
418 << " *.dat -- Tecplot ASCII file\n"
419 << " *.e -- Sandia's ExodusII format\n"
420 << " *.exo -- Sandia's ExodusII format\n"
421 << " *.fro -- ACDL's surface triangulation file\n"
422 << " *.gmv -- LANL's GMV (General Mesh Viewer) format\n"
423 << " *.mesh -- MEdit mesh format\n"
424 << " *.msh -- GMSH ASCII file\n"
425 << " *.n -- Sandia's Nemesis format\n"
426 << " *.nem -- Sandia's Nemesis format\n"
427 << " *.plt -- Tecplot binary file\n"
428 << " *.poly -- TetGen ASCII file\n"
429 << " *.pvtu -- VTK (paraview-readable) format\n"
430 << " *.stl -- STereoLithography triangulation format\n" \
431 << " *.ucd -- AVS's ASCII UCD format\n"
432 << " *.unv -- I-deas Universal format\n"
433 << " *.xda -- libMesh ASCII format\n"
434 << " *.xdr -- libMesh binary format,\n"
435 << std::endl
436 << "\n Exiting without writing output\n";
437 }
438 }
439
440 // Nasty hack for reading/writing zipped files
441 if (ends_with(basename, ".bz2"))
442 {
443 LOG_SCOPE("system(bzip2)", "NameBasedIO");
444 if (mymesh.processor_id() == 0)
445 {
446 std::string system_string = "bzip2 -f -c ";
447 system_string += new_name + " > " + name;
448 if (std::system(system_string.c_str()))
449 libmesh_file_error(system_string);
450 std::remove(new_name.c_str());
451 }
452 mymesh.comm().barrier();
453 }
454 if (ends_with(basename, ".xz"))
455 {
456 LOG_SCOPE("system(xz)", "NameBasedIO");
457 if (mymesh.processor_id() == 0)
458 {
459 std::string system_string = "xz -f -c ";
460 system_string += new_name + " > " + name;
461 if (std::system(system_string.c_str()))
462 libmesh_file_error(system_string);
463 std::remove(new_name.c_str());
464 }
465 mymesh.comm().barrier();
466 }
467 }
468}
const MT & mesh() const
OStreamProxy err

References libMesh::Parallel::Communicator::barrier(), libMesh::Utility::basename_of(), libMesh::Parallel::Communicator::broadcast(), libMesh::ParallelObject::comm(), libMesh::Utility::contains(), libMesh::Utility::ends_with(), libMesh::err, is_parallel_file_format(), libMesh::MeshOutput< MT >::mesh(), libMesh::MeshBase::n_partitions(), libMesh::GMVIO::partitioning(), libMesh::ParallelObject::processor_id(), libMesh::FroIO::write(), libMesh::GMVIO::write(), libMesh::MEDITIO::write(), libMesh::STLIO::write(), libMesh::TecplotIO::write(), libMesh::TetGenIO::write(), libMesh::UCDIO::write(), libMesh::UNVIO::write(), libMesh::VTKIO::write(), libMesh::XdrIO::write(), libMesh::Nemesis_IO::write(), libMesh::ExodusII_IO::write(), libMesh::CheckpointIO::write(), and libMesh::GmshIO::write().

Referenced by libMesh::UnstructuredMesh::find_neighbors(), and libMesh::UnstructuredMesh::write().

◆ write_discontinuous_equation_systems()

void libMesh::MeshOutput< MeshBase >::write_discontinuous_equation_systems ( const std::string &  fname,
const EquationSystems es,
const std::set< std::string > *  system_names = nullptr 
)
virtualinherited

This method implements writing a mesh with discontinuous data to a specified file where the data is taken from the EquationSystems object.

Definition at line 101 of file mesh_output.C.

92{
93 LOG_SCOPE("write_discontinuous_equation_systems()", "MeshOutput");
94
95 // We may need to gather and/or renumber a DistributedMesh to output
96 // it, making that const qualifier in our constructor a dirty lie
97 MT & my_mesh = const_cast<MT &>(*_obj);
98
99 // If we're asked to write data that's associated with a different
100 // mesh, output files full of garbage are the result.
101 libmesh_assert_equal_to(&es.get_mesh(), _obj);
102
103 // A non-renumbered mesh may not have a contiguous numbering, and
104 // that needs to be fixed before we can build a solution vector.
105 if (my_mesh.max_elem_id() != my_mesh.n_elem() ||
106 my_mesh.max_node_id() != my_mesh.n_nodes())
107 {
108 // If we were allowed to renumber then we should have already
109 // been properly renumbered...
110 libmesh_assert(!my_mesh.allow_renumbering());
111
112 libmesh_do_once(libMesh::out <<
113 "Warning: This MeshOutput subclass only supports meshes which are contiguously renumbered!"
114 << std::endl;);
115
116 my_mesh.allow_renumbering(true);
117
118 my_mesh.renumber_nodes_and_elements();
119
120 // Not sure what good going back to false will do here, the
121 // renumbering horses have already left the barn...
122 my_mesh.allow_renumbering(false);
123 }
124
125 MeshSerializer serialize(const_cast<MT &>(*_obj), !_is_parallel_format, _serial_only_needed_on_proc_0);
126
127 // Build the list of variable names that will be written.
128 std::vector<std::string> names;
129 es.build_variable_names (names, nullptr, system_names);
130
131 if (!_is_parallel_format)
132 {
133 // Build the nodal solution values & get the variable
134 // names from the EquationSystems object
135 std::vector<Number> soln;
136 es.build_discontinuous_solution_vector (soln, system_names,
137 nullptr, false, /* defaults */
138 this->get_add_sides());
139
140 this->write_nodal_data_discontinuous (fname, soln, names);
141 }
142 else // _is_parallel_format
143 {
144 libmesh_not_implemented();
145 }
146}
virtual void write_nodal_data_discontinuous(const std::string &, const std::vector< Number > &, const std::vector< std::string > &)
This method implements writing a mesh with discontinuous data to a specified file where the nodal dat...
OStreamProxy out

◆ write_equation_systems()

void libMesh::NameBasedIO::write_equation_systems ( const std::string &  filename,
const EquationSystems es,
const std::set< std::string > *  system_names = nullptr 
)
overridevirtual

This method implements writing a mesh with data to a specified file where the data is taken from the EquationSystems object.

We override the default MeshOutput::write_equation_systems because it only outputs nodal data by default, whereas we want to output a proper restart file if the requested filename is an XDA or XDR type.

Reimplemented from libMesh::MeshOutput< MeshBase >.

Definition at line 541 of file namebased_io.C.

544{
545 // XDA/XDR require a separate code path, and currently only support
546 // writing complete restarts
547 if (!system_names)
548 {
549 const std::string_view basename =
550 Utility::basename_of(filename);
551
552 if (Utility::contains(basename, ".xda"))
553 {
554 es.write(filename,WRITE,
557 return;
558 }
559 else if (Utility::contains(basename, ".xdr"))
560 {
561 es.write(filename,ENCODE,
564 return;
565 }
566 }
567
568 // Other formats just use the default "write nodal values" path
570 (filename, es, system_names);
571}
virtual void write_equation_systems(const std::string &, const EquationSystems &, const std::set< std::string > *system_names=nullptr)
This method implements writing a mesh with data to a specified file where the data is taken from the ...
Definition mesh_output.C:31

References libMesh::Utility::basename_of(), libMesh::Utility::contains(), libMesh::ENCODE, libMesh::WRITE, libMesh::EquationSystems::write(), libMesh::EquationSystems::WRITE_ADDITIONAL_DATA, libMesh::EquationSystems::WRITE_DATA, and libMesh::MeshOutput< MT >::write_equation_systems().

Referenced by main().

◆ write_nodal_data() [1/3]

void libMesh::MeshOutput< MeshBase >::write_nodal_data ( const std::string &  fname,
const EquationSystems es,
const std::set< std::string > *  system_names 
)
virtualinherited

This method should be overridden by "parallel" output formats for writing nodal data.

Instead of getting a localized copy of the nodal solution vector, it directly uses EquationSystems current_local_solution vectors to look up nodal values.

If not implemented, reorders the solutions into a nodal-only NumericVector and calls the above version of this function.

Reimplemented in libMesh::Nemesis_IO.

Definition at line 149 of file mesh_output.C.

165{
166 std::vector<std::string> names;
167 es.build_variable_names (names, nullptr, system_names);
168
169 std::unique_ptr<NumericVector<Number>> parallel_soln =
170 es.build_parallel_solution_vector(system_names);
171
172 this->write_nodal_data (fname, *parallel_soln, names);
173}
virtual void write_nodal_data(const std::string &, const std::vector< Number > &, const std::vector< std::string > &)
This method implements writing a mesh with nodal data to a specified file where the nodal data and va...

◆ write_nodal_data() [2/3]

void libMesh::MeshOutput< MeshBase >::write_nodal_data ( const std::string &  fname,
const NumericVector< Number > &  parallel_soln,
const std::vector< std::string > &  names 
)
virtualinherited

This method may be overridden by "parallel" output formats for writing nodal data.

Instead of getting a localized copy of the nodal solution vector, it is passed a NumericVector of type=PARALLEL which is in node-major order i.e. (u0,v0,w0, u1,v1,w1, u2,v2,w2, u3,v3,w3, ...) and contains n_nodes*n_vars total entries. Then, it is up to the individual I/O class to extract the required solution values from this vector and write them in parallel.

If not implemented, localizes the parallel vector into a std::vector and calls the other version of this function.

Reimplemented in libMesh::Nemesis_IO.

Definition at line 136 of file mesh_output.C.

152{
153 // This is the fallback implementation for parallel I/O formats that
154 // do not yet implement proper writing in parallel, and instead rely
155 // on the full solution vector being available on all processors.
156 std::vector<Number> soln;
157 parallel_soln.localize(soln);
158 this->write_nodal_data(fname, soln, names);
159}
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_data() [3/3]

void libMesh::NameBasedIO::write_nodal_data ( const std::string &  name,
const std::vector< Number > &  v,
const std::vector< std::string > &  vn 
)
overridevirtual

This method implements writing a mesh with nodal data to a specified file where the nodal data and variable names are provided.

Reimplemented from libMesh::MeshOutput< MeshBase >.

Definition at line 471 of file namebased_io.C.

474{
475 const MeshBase & mymesh = MeshOutput<MeshBase>::mesh();
476
477 using Utility::contains;
478 using Utility::ends_with;
479
480 // Write the file based on extension
481 if (contains(name, ".dat"))
482 TecplotIO(mymesh).write_nodal_data (name, v, vn);
483
484 else if (contains(name, ".exd") ||
485 contains(name, ".exo") ||
486 contains(name, ".e"))
487 ExodusII_IO(mymesh).write_nodal_data(name, v, vn);
488
489 else if (contains(name, ".gmv"))
490 {
491 if (mymesh.n_subdomains() > 1)
492 GMVIO(mymesh).write_nodal_data (name, v, vn);
493 else
494 {
495 GMVIO io(mymesh);
496 io.partitioning() = false;
497 io.write_nodal_data (name, v, vn);
498 }
499 }
500
501 else if (contains(name, ".mesh"))
502 MEDITIO(mymesh).write_nodal_data (name, v, vn);
503
504 else if (contains(name, ".msh"))
505 GmshIO(mymesh).write_nodal_data (name, v, vn);
506
507 else if (contains(name, ".nem") ||
508 contains(name, ".n"))
509 Nemesis_IO(mymesh).write_nodal_data(name, v, vn);
510
511 else if (contains(name, ".plt"))
512 TecplotIO(mymesh,true).write_nodal_data (name, v, vn);
513
514 else if (contains(name, ".pvtu"))
515 VTKIO(mymesh).write_nodal_data (name, v, vn);
516
517 else if (contains(name, ".ucd"))
518 UCDIO (mymesh).write_nodal_data (name, v, vn);
519
520 else
521 {
523 << " ERROR: Unrecognized file extension: " << name
524 << "\n I understand the following:\n\n"
525 << " *.dat -- Tecplot ASCII file\n"
526 << " *.e -- Sandia's ExodusII format\n"
527 << " *.exo -- Sandia's ExodusII format\n"
528 << " *.gmv -- LANL's GMV (General Mesh Viewer) format\n"
529 << " *.mesh -- MEdit mesh format\n"
530 << " *.msh -- GMSH ASCII file\n"
531 << " *.n -- Sandia's Nemesis format\n"
532 << " *.nem -- Sandia's Nemesis format\n"
533 << " *.plt -- Tecplot binary file\n"
534 << " *.pvtu -- Paraview VTK file\n"
535 << " *.ucd -- AVS's ASCII UCD format\n"
536 << "\n Exiting without writing output\n";
537 }
538}

References libMesh::Utility::contains(), libMesh::Utility::ends_with(), libMesh::err, libMesh::MeshOutput< MT >::mesh(), libMesh::MeshBase::n_subdomains(), libMesh::GMVIO::partitioning(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::GmshIO::write_nodal_data(), libMesh::GMVIO::write_nodal_data(), libMesh::MEDITIO::write_nodal_data(), libMesh::TecplotIO::write_nodal_data(), libMesh::VTKIO::write_nodal_data(), libMesh::Nemesis_IO::write_nodal_data(), and libMesh::UCDIO::write_nodal_data().

Referenced by libMesh::UnstructuredMesh::write().

◆ write_nodal_data_discontinuous()

virtual void libMesh::MeshOutput< MeshBase >::write_nodal_data_discontinuous ( const std::string &  ,
const std::vector< Number > &  ,
const std::vector< std::string > &   
)
inlinevirtualinherited

This method implements writing a mesh with discontinuous data to a specified file where the nodal data and variables names are provided.

Reimplemented in libMesh::ExodusII_IO.

Definition at line 118 of file mesh_output.h.

121 { libmesh_not_implemented(); }

Member Data Documentation

◆ _ascii_precision

unsigned int libMesh::MeshOutput< MeshBase >::_ascii_precision
privateinherited

Precision to use when writing ASCII files.

Definition at line 207 of file mesh_output.h.

◆ _is_parallel_format [1/2]

const bool libMesh::MeshInput< MeshBase >::_is_parallel_format
privateinherited

Flag specifying whether this format is parallel-capable.

If this is false (default) I/O is only permitted when the mesh has been serialized.

Definition at line 130 of file mesh_input.h.

◆ _is_parallel_format [2/2]

const bool libMesh::MeshOutput< MeshBase >::_is_parallel_format
protectedinherited

Flag specifying whether this format is parallel-capable.

If this is false (default) I/O is only permitted when the mesh has been serialized.

Definition at line 184 of file mesh_output.h.

◆ _obj

MeshBase * libMesh::MeshInput< MeshBase >::_obj
privateinherited

A pointer to a non-const object object.

This allows us to read the object from file.

Definition at line 123 of file mesh_input.h.

◆ _serial_only_needed_on_proc_0

const bool libMesh::MeshOutput< MeshBase >::_serial_only_needed_on_proc_0
protectedinherited

Flag specifying whether this format can be written by only serializing the mesh to processor zero.

If this is false (default) the mesh will be serialized to all processors

Definition at line 193 of file mesh_output.h.

◆ elems_of_dimension

std::vector<bool> libMesh::MeshInput< MeshBase >::elems_of_dimension
protectedinherited

A vector of bools describing what dimension elements have been encountered when reading a mesh.

Definition at line 107 of file mesh_input.h.


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