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

This class implements reading and writing meshes in the VTK format. More...

#include <vtk_io.h>

Inheritance diagram for libMesh::VTKIO:
[legend]

Classes

struct  ElementMaps
 Helper object that holds a map from VTK to libMesh element types and vice-versa. More...
 

Public Member Functions

 VTKIO (MeshBase &mesh)
 Constructor.
 
 VTKIO (const MeshBase &mesh)
 Constructor.
 
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.
 
virtual void read (const std::string &) override
 This method implements reading a mesh from a specified file in VTK format.
 
virtual void write (const std::string &) override
 Output the mesh without solutions to a .pvtu file.
 
void set_compression (bool b)
 Setter for compression flag.
 
vtkUnstructuredGrid * get_vtk_grid ()
 Get a pointer to the VTK unstructured grid data structure.
 
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_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 EquationSystems object.
 
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 int & ascii_precision ()
 Return/set the precision to use when writing ASCII files.
 

Protected Member Functions

MeshBase & mesh ()
 
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 MeshBase & mesh () 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 Member Functions

void nodes_to_vtk ()
 write the nodes from the mesh into a vtkUnstructuredGrid and update the local_node_map.
 
void cells_to_vtk ()
 write the cells from the mesh into a vtkUnstructuredGrid
 
void node_values_to_vtk (const std::string &name, const std::vector< Real > &local_values)
 write the nodal values of soln to a vtkUnstructuredGrid
 
void get_local_node_values (std::vector< Number > &local_values, std::size_t variable, const std::vector< Number > &soln, const std::vector< std::string > &names)
 Extract the values of soln that correspond to the nodes.
 

Static Private Member Functions

static std::map< ElemMappingType, ElementMaps > build_element_maps ()
 Static function used to construct _element_maps.
 

Private Attributes

vtkSmartPointer< vtkUnstructuredGrid > _vtk_grid
 Write the system vectors to vtk.
 
bool _compress
 Flag to indicate whether the output should be compressed.
 
std::map< dof_id_type, dof_id_type > _local_node_map
 maps global node id to node id of partition
 
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.
 

Static Private Attributes

static std::map< ElemMappingType, ElementMaps > _element_maps = VTKIO::build_element_maps()
 ElementMaps objects that are built statically and used by all instances of this class.
 

Detailed Description

This class implements reading and writing meshes in the VTK format.

Format description: cf. VTK home page.

This class will not have any functionality unless VTK is detected during configure and hence LIBMESH_HAVE_VTK is defined.

Author
Wout Ruijter
John W. Peterson
Date
2007

Definition at line 60 of file vtk_io.h.

Constructor & Destructor Documentation

◆ VTKIO() [1/2]

libMesh::VTKIO::VTKIO ( MeshBase &  mesh)
explicit

Constructor.

Takes a writable reference to a mesh object. This is the constructor required to read a mesh.

Definition at line 89 of file vtk_io.C.

89 :
90 MeshInput<MeshBase> (mesh, /*is_parallel_format=*/true),
91 MeshOutput<MeshBase>(mesh, /*is_parallel_format=*/true)
92#ifdef LIBMESH_HAVE_VTK
93 ,_compress(false)
94#endif
95{
96}
97
98
99
100// Constructor for writing
101VTKIO::VTKIO (const MeshBase & mesh) :
102 MeshOutput<MeshBase>(mesh, /*is_parallel_format=*/true)
103#ifdef LIBMESH_HAVE_VTK
104 ,_compress(false)
105#endif
106{
107}
108
109
110
111// Output the mesh without solutions to a .pvtu file
112void VTKIO::write (const std::string & name)
113{
114 std::vector<Number> soln;
115 std::vector<std::string> names;
116 this->write_nodal_data(name, soln, names);
117}
MeshOutput(const bool is_parallel_format=false, const bool serial_only_needed_on_proc_0=false)
Default constructor.
VTKIO(MeshBase &mesh)
Constructor.
Definition vtk_io.C:89
bool _compress
Flag to indicate whether the output should be compressed.
Definition vtk_io.h:174
template class LIBMESH_EXPORT MeshOutput< MeshBase >

◆ VTKIO() [2/2]

libMesh::VTKIO::VTKIO ( const MeshBase &  mesh)
explicit

Constructor.

Takes a read-only reference to a mesh object. This is the constructor required to write a mesh.

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.

◆ build_element_maps()

std::map< ElemMappingType, VTKIO::ElementMaps > libMesh::VTKIO::build_element_maps ( )
staticprivate

Static function used to construct _element_maps.

Definition at line 129 of file vtk_io.C.

130{
131 // Object to be filled up
132 std::map<ElemMappingType, VTKIO::ElementMaps> all_maps;
133 ElementMaps em; // Lagrange element maps
134
135 em.associate(EDGE2, VTK_LINE);
136 em.associate(EDGE3, VTK_QUADRATIC_EDGE);
137 em.associate(TRI3, VTK_TRIANGLE);
138 em.associate(TRI6, VTK_QUADRATIC_TRIANGLE);
139 em.associate(QUAD4, VTK_QUAD);
140 em.associate(QUAD8, VTK_QUADRATIC_QUAD);
141 em.associate(TET4, VTK_TETRA);
142 em.associate(TET10, VTK_QUADRATIC_TETRA);
143 em.associate(HEX8, VTK_HEXAHEDRON);
144 em.associate(HEX20, VTK_QUADRATIC_HEXAHEDRON);
145 em.associate(HEX27, VTK_TRIQUADRATIC_HEXAHEDRON);
146 em.associate(PRISM6, VTK_WEDGE);
147 em.associate(PRISM15, VTK_QUADRATIC_WEDGE);
148 em.associate(PRISM18, VTK_BIQUADRATIC_QUADRATIC_WEDGE);
149 em.associate(PYRAMID5, VTK_PYRAMID);
150
151 // VTK_BIQUADRATIC_QUAD has been around since VTK 5.0
152#if VTK_MAJOR_VERSION > 5 || (VTK_MAJOR_VERSION == 5 && VTK_MINOR_VERSION > 0)
153 em.associate(QUAD9, VTK_BIQUADRATIC_QUAD);
154#endif
155
156 // TRI3SUBDIVISION is for writing only
157 em.writing_map[TRI3SUBDIVISION] = VTK_TRIANGLE;
158 all_maps[ElemMappingType::LAGRANGE_MAP] = em;
159
160
161 // VTK_BEZIER_* types were introduced in VTK 9.0
162#if VTK_VERSION_LESS_THAN(9,0,0)
163 // Revert back to previous behavior when using an older version of VTK
165#else
166 ElementMaps bem; // Rational Bernstein element maps
167 bem.associate(EDGE2, VTK_LINE);
168 bem.associate(EDGE3, VTK_BEZIER_CURVE);
169 bem.associate(TRI3, VTK_TRIANGLE);
170 bem.associate(TRI6, VTK_BEZIER_TRIANGLE);
171 bem.associate(QUAD4, VTK_QUAD);
172 bem.associate(QUAD8, VTK_QUADRATIC_QUAD);
173 bem.associate(QUAD9, VTK_BEZIER_QUADRILATERAL);
174 bem.associate(TET4, VTK_TETRA);
175 bem.associate(TET10, VTK_QUADRATIC_TETRA);
176 bem.associate(HEX8, VTK_HEXAHEDRON);
177 bem.associate(HEX20, VTK_QUADRATIC_HEXAHEDRON);
178 bem.associate(HEX27, VTK_BEZIER_HEXAHEDRON);
179 bem.associate(PRISM6, VTK_WEDGE);
180 bem.associate(PRISM15, VTK_QUADRATIC_WEDGE);
181 bem.associate(PRISM18, VTK_BEZIER_WEDGE);
182 bem.associate(PYRAMID5, VTK_PYRAMID);
183 bem.writing_map[TRI3SUBDIVISION] = VTK_TRIANGLE;
185#endif
186
187 return all_maps;
188}
@ RATIONAL_BERNSTEIN_MAP

References libMesh::VTKIO::ElementMaps::associate(), libMesh::EDGE2, libMesh::EDGE3, libMesh::HEX20, libMesh::HEX27, libMesh::HEX8, libMesh::LAGRANGE_MAP, libMesh::PRISM15, libMesh::PRISM18, libMesh::PRISM6, libMesh::PYRAMID5, libMesh::QUAD4, libMesh::QUAD8, libMesh::QUAD9, libMesh::RATIONAL_BERNSTEIN_MAP, libMesh::TET10, libMesh::TET4, libMesh::TRI3, libMesh::TRI3SUBDIVISION, libMesh::TRI6, and libMesh::VTKIO::ElementMaps::writing_map.

◆ cells_to_vtk()

void libMesh::VTKIO::cells_to_vtk ( )
private

write the cells from the mesh into a vtkUnstructuredGrid

Definition at line 685 of file vtk_io.C.

686{
687 const MeshBase & mesh = MeshOutput<MeshBase>::mesh();
688
689 auto& element_map = libmesh_map_find(_element_maps, mesh.default_mapping_type());
690 vtkSmartPointer<vtkCellArray> cells = vtkSmartPointer<vtkCellArray>::New();
691 vtkSmartPointer<vtkIdList> pts = vtkSmartPointer<vtkIdList>::New();
692
693 std::vector<int> types(mesh.n_active_local_elem());
694
695 // We already created this but we need to add more if we have any
696 // ghost nodes
697 vtkAbstractArray * abstract_node_id =
698 _vtk_grid->GetPointData()->GetAbstractArray("libmesh_node_id");
699 vtkIntArray * node_id = vtkIntArray::SafeDownCast(abstract_node_id);
700 libmesh_assert(node_id);
701
702 vtkSmartPointer<vtkIntArray> elem_id = vtkSmartPointer<vtkIntArray>::New();
703 elem_id->SetName("libmesh_elem_id");
704 elem_id->SetNumberOfComponents(1);
705
706 vtkSmartPointer<vtkIntArray> subdomain_id = vtkSmartPointer<vtkIntArray>::New();
707 subdomain_id->SetName("subdomain_id");
708 subdomain_id->SetNumberOfComponents(1);
709
710 vtkSmartPointer<vtkIntArray> elem_proc_id = vtkSmartPointer<vtkIntArray>::New();
711 elem_proc_id->SetName("processor_id");
712 elem_proc_id->SetNumberOfComponents(1);
713
714 unsigned active_element_counter = 0;
715 for (const auto & elem : mesh.active_local_element_ptr_range())
716 {
717 // When using rational bernstein these hold the weights
718 if ( elem->type() == NODEELEM )
719 continue;
720
721 pts->SetNumberOfIds(elem->n_nodes());
722
723 // get the connectivity for this element
724 std::vector<dof_id_type> conn;
725 elem->connectivity(0, VTK, conn);
726
727 for (unsigned int i=0,
728 n_conn = cast_int<unsigned int>(conn.size());
729 i != n_conn; ++i)
730 {
731 // If the node ID is not found in the _local_node_map, we'll
732 // add it to the _vtk_grid. NOTE[JWP]: none of the examples
733 // I have actually enters this section of code...
734 if (!_local_node_map.count(conn[i]))
735 {
736 dof_id_type global_node_id = elem->node_id(i);
737
738 const Point & the_node = mesh.point(global_node_id);
739
740 // InsertNextPoint accepts either a double or float array of length 3.
741 double pt[3] = {0., 0., 0.};
742 for (unsigned int d=0; d<LIBMESH_DIM; ++d)
743 pt[d] = double(the_node(d));
744
745 // Insert the point into the _vtk_grid
746 vtkIdType local = _vtk_grid->GetPoints()->InsertNextPoint(pt);
747
748 // Update the _local_node_map with the ID returned by VTK
749 _local_node_map[global_node_id] =
750 cast_int<dof_id_type>(local);
751
752 node_id->InsertTuple1(local, global_node_id);
753 }
754
755 // Otherwise, the node ID was found in the _local_node_map, so
756 // insert it into the vtkIdList.
757 pts->InsertId(i, _local_node_map[conn[i]]);
758 }
759
760 vtkIdType vtkcellid = cells->InsertNextCell(pts);
761 types[active_element_counter] = cast_int<int>(element_map.find(elem->type()));
762
763 elem_id->InsertTuple1(vtkcellid, elem->id());
764 subdomain_id->InsertTuple1(vtkcellid, elem->subdomain_id());
765 elem_proc_id->InsertTuple1(vtkcellid, elem->processor_id());
766 ++active_element_counter;
767 } // end loop over active elements
768
769 _vtk_grid->SetCells(types.data(), cells);
770 _vtk_grid->GetCellData()->AddArray(elem_id);
771 _vtk_grid->GetCellData()->AddArray(subdomain_id);
772 _vtk_grid->GetCellData()->AddArray(elem_proc_id);
773}
virtual const Point & point(const dof_id_type i) const =0
ElemMappingType default_mapping_type() const
Returns the default master space to physical space mapping basis functions to be used on newly added ...
Definition mesh_base.h:938
dof_id_type n_active_local_elem() const
Definition mesh_base.h:711
const MT & mesh() const
std::map< dof_id_type, dof_id_type > _local_node_map
maps global node id to node id of partition
Definition vtk_io.h:179
static std::map< ElemMappingType, ElementMaps > _element_maps
ElementMaps objects that are built statically and used by all instances of this class.
Definition vtk_io.h:215
vtkSmartPointer< vtkUnstructuredGrid > _vtk_grid
Write the system vectors to vtk.
Definition vtk_io.h:169
libmesh_assert(ctx)
uint8_t dof_id_type
Definition id_types.h:67

References _element_maps, _local_node_map, _vtk_grid, libMesh::MeshBase::default_mapping_type(), libMesh::libmesh_assert(), libMesh::MeshInput< MeshBase >::mesh(), libMesh::MeshOutput< MT >::mesh(), libMesh::MeshBase::n_active_local_elem(), libMesh::NODEELEM, libMesh::MeshBase::point(), and libMesh::VTK.

Referenced by write_nodal_data().

◆ 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; }

◆ get_local_node_values()

void libMesh::VTKIO::get_local_node_values ( std::vector< Number > &  local_values,
std::size_t  variable,
const std::vector< Number > &  soln,
const std::vector< std::string > &  names 
)
private

Extract the values of soln that correspond to the nodes.

This method overwrites all values in local_values

Definition at line 794 of file vtk_io.C.

798{
799 const MeshBase & mesh = MeshOutput<MeshBase>::mesh();
800 std::size_t num_vars = names.size();
801 dof_id_type num_nodes = mesh.n_nodes();
802
803 local_values.clear();
804 local_values.resize(_local_node_map.size(), 0.0);
805
806 // loop over all nodes and get the solution for the current
807 // variable, if the node is in the current partition
808 for (dof_id_type k=0; k<num_nodes; ++k)
809 if (const auto local_node_it = _local_node_map.find(k);
810 local_node_it != _local_node_map.end())
811 local_values[local_node_it->second] = soln[k*num_vars + variable];
812}
virtual dof_id_type n_nodes() const =0

References _local_node_map, libMesh::MeshInput< MeshBase >::mesh(), libMesh::MeshOutput< MT >::mesh(), and libMesh::MeshBase::n_nodes().

Referenced by write_nodal_data().

◆ get_vtk_grid()

vtkUnstructuredGrid * libMesh::VTKIO::get_vtk_grid ( )

Get a pointer to the VTK unstructured grid data structure.

Definition at line 591 of file vtk_io.C.

592{
593 return _vtk_grid;
594}

References _vtk_grid.

◆ 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.

◆ node_values_to_vtk()

void libMesh::VTKIO::node_values_to_vtk ( const std::string &  name,
const std::vector< Real > &  local_values 
)
private

write the nodal values of soln to a vtkUnstructuredGrid

Definition at line 775 of file vtk_io.C.

777{
778 vtkSmartPointer<vtkDoubleArray> data = vtkSmartPointer<vtkDoubleArray>::New();
779 data->SetName(name.c_str());
780
781 libmesh_assert_equal_to(_local_node_map.size(), local_values.size());
782
783 // number of local and ghost nodes
784 data->SetNumberOfValues(_local_node_map.size());
785
786 // copy values into vtk
787 for (auto i : index_range(local_values)) {
788 data->SetValue(i, double(local_values[i]));
789 }
790
791 _vtk_grid->GetPointData()->AddArray(data);
792}
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition int_range.h:153

References _local_node_map, _vtk_grid, and libMesh::index_range().

Referenced by write_nodal_data().

◆ nodes_to_vtk()

void libMesh::VTKIO::nodes_to_vtk ( )
private

write the nodes from the mesh into a vtkUnstructuredGrid and update the local_node_map.

Definition at line 605 of file vtk_io.C.

606{
607 const MeshBase & mesh = MeshOutput<MeshBase>::mesh();
608
609 // containers for points and coordinates of points
610 vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
611 vtkSmartPointer<vtkDoubleArray> pcoords = vtkSmartPointer<vtkDoubleArray>::New();
612 // if this grid is to be used in VTK then the dimension of the points should be 3
613 pcoords->SetNumberOfComponents(LIBMESH_DIM);
614 pcoords->Allocate(3*mesh.n_local_nodes());
615 points->SetNumberOfPoints(mesh.n_local_nodes()); // it seems that it needs this to prevent a segfault
616
617 // SetRationalWeights() was introduced in VTK 9.0
618#if !VTK_VERSION_LESS_THAN(9,0,0)
619 bool have_weights = false;
620 int weight_index = 0;
621 vtkSmartPointer<vtkDoubleArray> rational_weights;
622
624 {
625 rational_weights = vtkSmartPointer<vtkDoubleArray>::New();
626 rational_weights->SetName("RationalWeights");
627 rational_weights->SetNumberOfComponents(1);
628 weight_index = static_cast<int>(mesh.default_mapping_data());
629 have_weights = true;
630 }
631#endif
632
633 vtkSmartPointer<vtkIntArray> node_id = vtkSmartPointer<vtkIntArray>::New();
634 node_id->SetName("libmesh_node_id");
635 node_id->SetNumberOfComponents(1);
636
637 unsigned int local_node_counter = 0;
638
639 for (const auto & node_ptr : mesh.local_node_ptr_range())
640 {
641 const Node & node = *node_ptr;
642
643 double pnt[3] = {0, 0, 0};
644 for (unsigned int i=0; i<LIBMESH_DIM; ++i)
645 pnt[i] = double(node(i));
646
647 // Fill mapping between global and local node numbers
648 _local_node_map[node.id()] = local_node_counter;
649
650 // add point
651#if VTK_VERSION_LESS_THAN(7,1,0)
652 pcoords->InsertNextTupleValue(pnt);
653#else
654 pcoords->InsertNextTuple(pnt);
655#endif
656#if !VTK_VERSION_LESS_THAN(9,0,0)
657 if (have_weights)
658 {
659 Real weight = node.get_extra_datum<Real>(weight_index);
660 rational_weights->InsertTuple1(local_node_counter, double(weight));
661 }
662#endif
663
664 node_id->InsertTuple1(local_node_counter, node.id());
665
666 ++local_node_counter;
667 }
668
669 // add coordinates to points
670 points->SetData(pcoords);
671
672 // add points to grid
673 _vtk_grid->SetPoints(points);
674 _vtk_grid->GetPointData()->AddArray(node_id);
675
676#if !VTK_VERSION_LESS_THAN(9,0,0)
677 if (have_weights)
678 _vtk_grid->GetPointData()->SetRationalWeights(rational_weights);
679
680#endif
681}
dof_id_type n_local_nodes() const
Definition mesh_base.h:588
unsigned char default_mapping_data() const
Returns any default data value used by the master space to physical space mapping.
Definition mesh_base.h:956
dof_id_type weight(const MeshBase &mesh, const processor_id_type pid)
Definition mesh_tools.C:444
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

References _local_node_map, _vtk_grid, libMesh::MeshBase::default_mapping_data(), libMesh::MeshBase::default_mapping_type(), libMesh::DofObject::get_extra_datum(), libMesh::DofObject::id(), libMesh::MeshInput< MeshBase >::mesh(), libMesh::MeshOutput< MT >::mesh(), libMesh::MeshBase::n_local_nodes(), libMesh::RATIONAL_BERNSTEIN_MAP, and libMesh::Real.

Referenced by write_nodal_data().

◆ read()

void libMesh::VTKIO::read ( const std::string &  name)
overridevirtual

This method implements reading a mesh from a specified file in VTK format.

FIXME: This is known to write nonsense on AMR meshes and it strips the imaginary parts of complex Numbers.

As with other Mesh IO classes, this interface is still still "available" when !LIBMESH_HAVE_VTK, however, it will throw a runtime error.

This function is not currently used by anything, so it is commented out, and may eventually be removed entirely.

Implements libMesh::MeshInput< MeshBase >.

Definition at line 258 of file vtk_io.C.

259{
260 // This is a serial-only process for now;
261 // the Mesh should be read on processor 0 and
262 // broadcast later
263 libmesh_assert_equal_to (MeshOutput<MeshBase>::mesh().processor_id(), 0);
264
265 // Keep track of what kinds of elements this file contains
266 elems_of_dimension.clear();
267 elems_of_dimension.resize(4, false);
268
269 // VTK XML unstructured grid files come in two root-element forms: a
270 // plain serial "UnstructuredGrid" file (conventionally .vtu), and a
271 // "PUnstructuredGrid" descriptor (conventionally .pvtu) referencing one
272 // or more serial piece files for parallel use. Each needs a different
273 // reader class. Sniff the file's actual root <VTKFile type="..."/>
274 // attribute rather than assuming one from the extension (or, worse,
275 // always assuming one -- vtkXMLPUnstructuredGridReader silently yields
276 // an empty grid, rather than any diagnostic, when handed the other
277 // format).
278 std::string file_type;
279 {
280 vtkSmartPointer<vtkXMLFileReadTester> tester =
281 vtkSmartPointer<vtkXMLFileReadTester>::New();
282 tester->SetFileName(name.c_str());
283
284 libmesh_error_msg_if
285 (!tester->TestReadFile(),
286 "Error: " << name << " does not appear to be a VTK XML file.");
287
288 const char * file_type_cstr = tester->GetFileDataType();
289 libmesh_error_msg_if
290 (!file_type_cstr,
291 "Error: " << name << " does not specify a VTK XML data type.");
292 file_type = file_type_cstr;
293 }
294
295 if (file_type == "PUnstructuredGrid")
296 {
297 vtkSmartPointer<vtkXMLPUnstructuredGridReader> reader =
298 vtkSmartPointer<vtkXMLPUnstructuredGridReader>::New();
299 reader->SetFileName(name.c_str());
300 reader->Update();
301 _vtk_grid = reader->GetOutput();
302 }
303 else if (file_type == "UnstructuredGrid")
304 {
305 vtkSmartPointer<vtkXMLUnstructuredGridReader> reader =
306 vtkSmartPointer<vtkXMLUnstructuredGridReader>::New();
307 reader->SetFileName(name.c_str());
308 reader->Update();
309 _vtk_grid = reader->GetOutput();
310 }
311 else
312 libmesh_error_msg
313 ("Error: " << name << " is a VTK XML file of type \"" << file_type
314 << "\", but libMesh's VTKIO reader only supports \"UnstructuredGrid\" "
315 "(.vtu) and \"PUnstructuredGrid\" (.pvtu) files.");
316
317 // Get a reference to the mesh
318 MeshBase & mesh = MeshInput<MeshBase>::mesh();
319
320 // Clear out any pre-existing data from the Mesh
321 mesh.clear();
322
323 // Try to preserve any libMesh ids and subdomain ids we find in the
324 // file. This will be null if there are none, e.g. if a non-libMesh
325 // program wrote this file.
326
327 vtkAbstractArray * abstract_elem_id =
328 _vtk_grid->GetCellData()->GetAbstractArray("libmesh_elem_id");
329 vtkAbstractArray * abstract_node_id =
330 _vtk_grid->GetPointData()->GetAbstractArray("libmesh_node_id");
331 vtkAbstractArray * abstract_subdomain_id =
332 _vtk_grid->GetCellData()->GetAbstractArray("subdomain_id");
333
334 // Get ids as integers. This will be null if they are another data
335 // type, e.g. if a non-libMesh program used the names we thought
336 // were unique for different data.
337 vtkIntArray * elem_id = vtkIntArray::SafeDownCast(abstract_elem_id);
338 vtkIntArray * node_id = vtkIntArray::SafeDownCast(abstract_node_id);
339 vtkIntArray * subdomain_id = vtkIntArray::SafeDownCast(abstract_subdomain_id);
340
341 if (abstract_elem_id && !elem_id)
342 libmesh_warning("Found non-integral libmesh_elem_id array; forced to ignore it.\n"
343 "This is technically valid but probably broken.");
344
345 if (abstract_node_id && !node_id)
346 libmesh_warning("Found non-integral libmesh_node_id array; forced to ignore it.\n"
347 "This is technically valid but probably broken.");
348
349 if (abstract_subdomain_id && !subdomain_id)
350 libmesh_warning("Found non-integral subdomain_id array; forced to ignore it.\n"
351 "This is technically valid but probably broken.");
352
353 // Get the number of points from the _vtk_grid object
354 const unsigned int vtk_num_points = static_cast<unsigned int>(_vtk_grid->GetNumberOfPoints());
355
356 // Map from VTK indexing to libMesh id if necessary
357 std::vector<dof_id_type> vtk_node_to_libmesh;
358 if (node_id)
359 vtk_node_to_libmesh.resize(vtk_num_points);
360
361 // always numbered nicely so we can loop like this
362 for (unsigned int i=0; i<vtk_num_points; ++i)
363 {
364 // add to the id map
365 // and add the actual point
366 double pnt[3];
367 _vtk_grid->GetPoint(static_cast<vtkIdType>(i), pnt);
368 Point xyz(pnt[0], pnt[1], pnt[2]);
369
370 if (node_id)
371 {
372 auto id = node_id->GetValue(i);
373
374 // It would nice to distinguish between "duplicate nodes
375 // because one was ghosted in a parallel file segment" and
376 // "duplicate nodes because there was a bug", but I'm not
377 // sure how to do that with vtkXMLPUnstructuredGridReader
378 if (!mesh.query_node_ptr(id))
379 mesh.add_point(xyz, id);
380 vtk_node_to_libmesh[i] = id;
381 }
382 else
383 mesh.add_point(xyz, i);
384 }
385
386 // Get the number of cells from the _vtk_grid object
387 const unsigned int vtk_num_cells = static_cast<unsigned int>(_vtk_grid->GetNumberOfCells());
388
389 auto& element_map = libmesh_map_find(_element_maps, mesh.default_mapping_type());
390
391 vtkSmartPointer<vtkGenericCell> cell = vtkSmartPointer<vtkGenericCell>::New();
392 for (unsigned int i=0; i<vtk_num_cells; ++i)
393 {
394 _vtk_grid->GetCell(i, cell);
395
396 std::unique_ptr<Elem> elem;
397
398 // VTK polyhedra are described by a stream of polygonal faces
399 // rather than by an ordered node list, so they are built
400 // separately as C0Polyhedron elements with their nodes already
401 // assigned via their sides.
402 if (cell->GetCellType() == VTK_POLYHEDRON)
403 elem = add_vtk_polyhedron(*_vtk_grid, mesh,
404 static_cast<vtkIdType>(i),
405 node_id, vtk_node_to_libmesh);
406 else
407 {
408 // Get the libMesh element type corresponding to this VTK element type.
409 ElemType libmesh_elem_type = element_map.find(cell->GetCellType());
410 elem = Elem::build(libmesh_elem_type);
411
412 // get the straightforward numbering from the VTK cells
413 for (auto j : elem->node_index_range())
414 {
415 const auto vtk_point_id = cell->GetPointId(j);
416 const dof_id_type libmesh_node_id = node_id ?
417 vtk_node_to_libmesh[vtk_point_id] : vtk_point_id;
418
419 elem->set_node(j, mesh.node_ptr(libmesh_node_id));
420 }
421
422 // then get the connectivity
423 std::vector<dof_id_type> conn;
424 elem->connectivity(0, VTK, conn);
425
426 // then reshuffle the nodes according to the connectivity, this
427 // two-time-assign would evade the definition of the vtk_mapping
428 for (unsigned int j=0,
429 n_conn = cast_int<unsigned int>(conn.size());
430 j != n_conn; ++j)
431 elem->set_node(j, mesh.node_ptr(conn[j]));
432 }
433
434 if (elem_id)
435 {
436 auto id = elem_id->GetValue(i);
437 libmesh_error_msg_if
438 (mesh.query_elem_ptr(id), "Duplicate element id " << id <<
439 " found in libmesh_elem_ids");
440 elem->set_id(id);
441 }
442 else
443 elem->set_id(i);
444
445 if (subdomain_id)
446 {
447 auto sbdid = subdomain_id->GetValue(i);
448 elem->subdomain_id() = sbdid;
449 }
450
451 elems_of_dimension[elem->dim()] = true;
452
453 mesh.add_elem(std::move(elem));
454 } // end loop over VTK cells
455
456 // Set the mesh dimension to the largest encountered for an element
457 for (unsigned char i=0; i!=4; ++i)
458 if (elems_of_dimension[i])
460
461#if LIBMESH_DIM < 3
462 libmesh_error_msg_if(mesh.mesh_dimension() > LIBMESH_DIM,
463 "Cannot open dimension "
465 << " mesh file when configured without "
467 << "D support.");
468#endif // LIBMESH_DIM < 3
469}
static std::unique_ptr< Elem > build(const ElemType type, Elem *p=nullptr)
Definition elem.C:382
virtual const Node * node_ptr(const dof_id_type i) const =0
unsigned int mesh_dimension() const
Definition mesh_base.C:435
virtual const Node * query_node_ptr(const dof_id_type i) const =0
void set_mesh_dimension(unsigned char d)
Resets the logical dimension of the mesh.
Definition mesh_base.h:423
virtual Node * add_point(const Point &p, const dof_id_type id=DofObject::invalid_id, const processor_id_type proc_id=DofObject::invalid_processor_id)=0
Add a new Node at Point p to the end of the vertex array, with processor_id procid.
virtual void clear()
Deletes all the element and node data that is currently stored.
Definition mesh_base.C:1036
virtual const Elem * query_elem_ptr(const dof_id_type i) const =0
virtual Elem * add_elem(Elem *e)=0
Add elem e to the end of the element array.
std::vector< bool > elems_of_dimension
A vector of bools describing what dimension elements have been encountered when reading a mesh.
Definition mesh_input.h:107
ElemType
Defines an enum for geometric element types.
void tester(const std::set< int > &s, int i)

References _element_maps, _vtk_grid, libMesh::MeshBase::add_elem(), libMesh::MeshBase::add_point(), libMesh::Elem::build(), libMesh::MeshBase::clear(), libMesh::MeshBase::default_mapping_type(), libMesh::MeshInput< MeshBase >::elems_of_dimension, libMesh::MeshInput< MeshBase >::mesh(), libMesh::MeshInput< MT >::mesh(), libMesh::MeshBase::mesh_dimension(), libMesh::MeshBase::node_ptr(), libMesh::MeshBase::query_elem_ptr(), libMesh::MeshBase::query_node_ptr(), libMesh::MeshBase::set_mesh_dimension(), tester(), and libMesh::VTK.

Referenced by libMesh::NameBasedIO::read(), and MeshInputTest::testVTKReadNotAnXMLFile().

◆ set_compression()

void libMesh::VTKIO::set_compression ( bool  b)

Setter for compression flag.

Definition at line 598 of file vtk_io.C.

599{
600 this->_compress = b;
601}
static const Real b

References _compress, and b.

◆ 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()

virtual void libMesh::VTKIO::write ( const std::string &  )
overridevirtual

Output the mesh without solutions to a .pvtu file.

As with other Mesh IO classes, this interface is still still "available" when !LIBMESH_HAVE_VTK, however, it will throw a runtime error.

Implements libMesh::MeshOutput< MeshBase >.

Referenced by main(), MeshInputTest::testExodusFileMappings(), MeshInputTest::testVTKPreserveElemIds(), MeshInputTest::testVTKPreserveSubdomainIds(), and libMesh::NameBasedIO::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::MeshOutput< MeshBase >::write_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 data to a specified file where the data is taken from the EquationSystems object.

Reimplemented in libMesh::NameBasedIO, and libMesh::ExodusII_IO.

Definition at line 92 of file mesh_output.C.

34{
35 LOG_SCOPE("write_equation_systems()", "MeshOutput");
36
37 // We may need to gather and/or renumber a DistributedMesh to output
38 // it, making that const qualifier in our constructor a dirty lie
39 MT & my_mesh = const_cast<MT &>(*_obj);
40
41 // If we're asked to write data that's associated with a different
42 // mesh, output files full of garbage are the result.
43 libmesh_assert_equal_to(&es.get_mesh(), _obj);
44
45 // A non-parallel format, non-renumbered mesh may not have a contiguous
46 // numbering, and that needs to be fixed before we can build a solution vector.
47 if (!_is_parallel_format &&
48 (my_mesh.max_elem_id() != my_mesh.n_elem() ||
49 my_mesh.max_node_id() != my_mesh.n_nodes()))
50 {
51 // If we were allowed to renumber then we should have already
52 // been properly renumbered...
53 libmesh_assert(!my_mesh.allow_renumbering());
54
55 libmesh_do_once(libMesh::out <<
56 "Warning: This MeshOutput subclass only supports meshes which are contiguously renumbered!"
57 << std::endl;);
58
59 my_mesh.allow_renumbering(true);
60
61 my_mesh.renumber_nodes_and_elements();
62
63 // Not sure what good going back to false will do here, the
64 // renumbering horses have already left the barn...
65 my_mesh.allow_renumbering(false);
66 }
67
68 if (!_is_parallel_format)
69 {
70 MeshSerializer serialize(const_cast<MT &>(*_obj), !_is_parallel_format, _serial_only_needed_on_proc_0);
71
72 // Build the list of variable names that will be written.
73 std::vector<std::string> names;
74 es.build_variable_names (names, nullptr, system_names);
75
76 // Build the nodal solution values & get the variable
77 // names from the EquationSystems object
78 std::vector<Number> soln;
79 es.build_solution_vector (soln, system_names,
80 this->get_add_sides());
81
82 this->write_nodal_data (fname, soln, names);
83 }
84 else // _is_parallel_format
85 this->write_nodal_data (fname, es, system_names);
86}
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() [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}

◆ 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::VTKIO::write_nodal_data ( const std::string &  fname,
const std::vector< Number > &  soln,
const std::vector< std::string > &  names 
)
overridevirtual

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

As with other Mesh IO classes, this interface is still still "available" when !LIBMESH_HAVE_VTK, however, it will throw a runtime error.

Reimplemented from libMesh::MeshOutput< MeshBase >.

Definition at line 473 of file vtk_io.C.

476{
477 // Warn that the .pvtu file extension should be used. Paraview
478 // recognizes this, and it works in both serial and parallel. Only
479 // warn about this once.
480 if (!Utility::ends_with(fname, ".pvtu"))
481 libmesh_do_once(libMesh::err << "The .pvtu extension should be used when writing VTK files in libMesh.");
482
483 // If there are variable names being written, the solution vector
484 // should not be empty, it should have been broadcast to all
485 // processors by the MeshOutput base class, since VTK is a parallel
486 // format. Verify this before going further.
487 libmesh_error_msg_if(!names.empty() && soln.empty(),
488 "Empty soln vector in VTKIO::write_nodal_data().");
489
490 // Get a reference to the mesh
491 const MeshBase & mesh = MeshOutput<MeshBase>::mesh();
492
493 // we only use Unstructured grids
494 _vtk_grid = vtkSmartPointer<vtkUnstructuredGrid>::New();
495 vtkSmartPointer<vtkXMLPUnstructuredGridWriter> writer = vtkSmartPointer<vtkXMLPUnstructuredGridWriter>::New();
496#ifdef LIBMESH_HAVE_MPI
497 // Set VTK to the same communicator as libMesh
498 vtkSmartPointer<vtkMPICommunicator> vtk_comm = vtkSmartPointer<vtkMPICommunicator>::New();
499 MPI_Comm mpi_comm = mesh.comm().get();
500 vtkMPICommunicatorOpaqueComm vtk_opaque_comm(&mpi_comm);
501 vtk_comm->InitializeExternal(&vtk_opaque_comm);
502
503 vtkSmartPointer<vtkMPIController> vtk_mpi_ctrl = vtkSmartPointer<vtkMPIController>::New();
504 vtk_mpi_ctrl->SetCommunicator(vtk_comm);
505
506 writer->SetController(vtk_mpi_ctrl);
507#endif
508
509 // add nodes to the grid and update _local_node_map
510 _local_node_map.clear();
511 this->nodes_to_vtk();
512
513 // add cells to the grid
514 this->cells_to_vtk();
515
516 // add nodal solutions to the grid, if solutions are given
517 if (names.size() > 0)
518 {
519 std::size_t num_vars = names.size();
520 std::vector<Number> local_values;
521
522#ifdef LIBMESH_USE_COMPLEX_NUMBERS
523 std::vector<Real> local_real_values;
524#endif
525
526 for (std::size_t variable=0; variable<num_vars; ++variable)
527 {
528 get_local_node_values(local_values, variable, soln, names);
529
530#ifdef LIBMESH_USE_COMPLEX_NUMBERS
531 // write real part
532 local_real_values.resize(local_values.size());
533 std::transform(local_values.begin(), local_values.end(),
534 local_real_values.begin(),
535 [](Number x) { return x.real(); });
536 node_values_to_vtk(names[variable] + "_real", local_real_values);
537
538 // write imaginary part
539 local_real_values.resize(local_values.size());
540 std::transform(local_values.begin(), local_values.end(),
541 local_real_values.begin(),
542 [](Number x) { return x.imag(); });
543 node_values_to_vtk(names[variable] + "_imag", local_real_values);
544#else
545 node_values_to_vtk(names[variable], local_values);
546#endif
547 }
548 }
549
550 // Tell the writer how many partitions exist and on which processor
551 // we are currently
552 writer->SetNumberOfPieces(mesh.n_processors());
553 writer->SetStartPiece(mesh.processor_id());
554 writer->SetEndPiece(mesh.processor_id());
555
556 // partitions overlap by one node
557 // FIXME: According to this document
558 // http://paraview.org/Wiki/images/5/51/SC07_tut107_ParaView_Handouts.pdf
559 // the ghosts are cells rather than nodes.
560 writer->SetGhostLevel(1);
561
562 // VTK 6 replaces SetInput() with SetInputData(). See
563 // http://www.vtk.org/Wiki/VTK/VTK_6_Migration/Replacement_of_SetInput
564 // for the full explanation.
565#if VTK_VERSION_LESS_THAN(6,0,0)
566 writer->SetInput(_vtk_grid);
567#else
568 writer->SetInputData(_vtk_grid);
569#endif
570
571 writer->SetFileName(fname.c_str());
572 writer->SetDataModeToAscii();
573
574 // compress the output, if desired (switches also to binary)
575 if (this->_compress)
576 {
577#if !VTK_VERSION_LESS_THAN(5,6,0)
578 writer->SetCompressorTypeToZLib();
579 writer->SetDataModeToBinary();
580#else
581 libmesh_do_once(libMesh::err << "Compression not implemented with old VTK libs!" << std::endl;);
582#endif
583 }
584
585 writer->Write();
586
587}
processor_id_type processor_id() const
const Parallel::Communicator & comm() const
processor_id_type n_processors() const
void node_values_to_vtk(const std::string &name, const std::vector< Real > &local_values)
write the nodal values of soln to a vtkUnstructuredGrid
Definition vtk_io.C:775
void nodes_to_vtk()
write the nodes from the mesh into a vtkUnstructuredGrid and update the local_node_map.
Definition vtk_io.C:605
void cells_to_vtk()
write the cells from the mesh into a vtkUnstructuredGrid
Definition vtk_io.C:685
void get_local_node_values(std::vector< Number > &local_values, std::size_t variable, const std::vector< Number > &soln, const std::vector< std::string > &names)
Extract the values of soln that correspond to the nodes.
Definition vtk_io.C:794
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
OStreamProxy err

References _compress, _local_node_map, _vtk_grid, cells_to_vtk(), libMesh::ParallelObject::comm(), libMesh::Utility::ends_with(), libMesh::err, libMesh::Parallel::Communicator::get(), get_local_node_values(), libMesh::MeshInput< MeshBase >::mesh(), libMesh::MeshOutput< MT >::mesh(), libMesh::ParallelObject::n_processors(), node_values_to_vtk(), nodes_to_vtk(), and libMesh::ParallelObject::processor_id().

Referenced by libMesh::NameBasedIO::write_nodal_data().

◆ 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.

◆ _compress

bool libMesh::VTKIO::_compress
private

Flag to indicate whether the output should be compressed.

Definition at line 174 of file vtk_io.h.

Referenced by set_compression(), and write_nodal_data().

◆ _element_maps

std::map< ElemMappingType, VTKIO::ElementMaps > libMesh::VTKIO::_element_maps = VTKIO::build_element_maps()
staticprivate

ElementMaps objects that are built statically and used by all instances of this class.

Definition at line 215 of file vtk_io.h.

Referenced by cells_to_vtk(), and read().

◆ _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.

◆ _local_node_map

std::map<dof_id_type, dof_id_type> libMesh::VTKIO::_local_node_map
private

maps global node id to node id of partition

Definition at line 179 of file vtk_io.h.

Referenced by cells_to_vtk(), get_local_node_values(), node_values_to_vtk(), nodes_to_vtk(), and write_nodal_data().

◆ _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.

◆ _vtk_grid

vtkSmartPointer<vtkUnstructuredGrid> libMesh::VTKIO::_vtk_grid
private

Write the system vectors to vtk.

This function is not currently used by anything, so it is commented out, and may eventually be removed entirely. pointer to the VTK grid. the vtkSmartPointer will automatically initialize the value to null and keep track of reference counting.

Definition at line 169 of file vtk_io.h.

Referenced by cells_to_vtk(), get_vtk_grid(), node_values_to_vtk(), nodes_to_vtk(), read(), and write_nodal_data().

◆ 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: