Dune Core Modules (2.5.2)

vtuwriter.hh
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 
4 #ifndef DUNE_GRID_IO_FILE_VTK_VTUWRITER_HH
5 #define DUNE_GRID_IO_FILE_VTK_VTUWRITER_HH
6 
7 #include <ostream>
8 #include <string>
9 
11 #include <dune/common/indent.hh>
12 
15 
16 namespace Dune {
17 
20 
21  namespace VTK {
22 
24 
96  class VTUWriter {
97  public:
98  std::ostream& stream;
99  enum Phase { main, appended } phase;
100 
101  private:
102  DataArrayWriterFactory factory;
103  Indent indent;
104 
105  std::string fileType;
106  std::string cellName;
107 
108  bool doAppended;
109 
110  public:
112 
120  inline VTUWriter(std::ostream& stream_, OutputType outputType,
121  FileType fileType_)
122  : stream(stream_), factory(outputType, stream)
123  {
124  switch(fileType_) {
125  case polyData :
126  fileType = "PolyData";
127  cellName = "Lines";
128  break;
129  case unstructuredGrid :
130  fileType = "UnstructuredGrid";
131  cellName = "Cells";
132  break;
133  default :
134  DUNE_THROW(IOError, "VTUWriter: Unknown fileType: " << fileType_);
135  }
136  const std::string& byteOrder = getEndiannessString();
137 
138  stream << indent << "<?xml version=\"1.0\"?>\n";
139  stream << indent << "<VTKFile"
140  << " type=\"" << fileType << "\""
141  << " version=\"0.1\""
142  << " byte_order=\"" << byteOrder << "\">\n";
143  ++indent;
144  }
145 
147  inline ~VTUWriter() {
148  --indent;
149  stream << indent << "</VTKFile>\n"
150  << std::flush;
151  }
152 
154 
165  inline void beginPointData(const std::string& scalars = "",
166  const std::string& vectors = "") {
167  switch(phase) {
168  case main :
169  stream << indent << "<PointData";
170  if(scalars != "") stream << " Scalars=\"" << scalars << "\"";
171  if(vectors != "") stream << " Vectors=\"" << vectors << "\"";
172  stream << ">\n";
173  ++indent;
174  break;
175  case appended :
176  break;
177  }
178  }
180  inline void endPointData() {
181  switch(phase) {
182  case main :
183  --indent;
184  stream << indent << "</PointData>\n";
185  break;
186  case appended :
187  break;
188  }
189  }
190 
192 
203  inline void beginCellData(const std::string& scalars = "",
204  const std::string& vectors = "") {
205  switch(phase) {
206  case main :
207  stream << indent << "<CellData";
208  if(scalars != "") stream << " Scalars=\"" << scalars << "\"";
209  if(vectors != "") stream << " Vectors=\"" << vectors << "\"";
210  stream << ">\n";
211  ++indent;
212  break;
213  case appended :
214  break;
215  }
216  }
218  inline void endCellData() {
219  switch(phase) {
220  case main :
221  --indent;
222  stream << indent << "</CellData>\n";
223  break;
224  case appended :
225  break;
226  }
227  }
228 
230 
236  inline void beginPoints() {
237  switch(phase) {
238  case main :
239  stream << indent << "<Points>\n";
240  ++indent;
241  break;
242  case appended :
243  break;
244  }
245  }
247  inline void endPoints() {
248  switch(phase) {
249  case main :
250  --indent;
251  stream << indent << "</Points>\n";
252  break;
253  case appended :
254  break;
255  }
256  }
257 
259 
272  inline void beginCells() {
273  switch(phase) {
274  case main :
275  stream << indent << "<" << cellName << ">\n";
276  ++indent;
277  break;
278  case appended :
279  break;
280  }
281  }
283  inline void endCells() {
284  switch(phase) {
285  case main :
286  --indent;
287  stream << indent << "</" << cellName << ">\n";
288  break;
289  case appended :
290  break;
291  }
292  }
293 
295 
308  inline void beginMain(unsigned ncells, unsigned npoints) {
309  stream << indent << "<" << fileType << ">\n";
310  ++indent;
311  stream << indent << "<Piece"
312  << " NumberOf" << cellName << "=\"" << ncells << "\""
313  << " NumberOfPoints=\"" << npoints << "\">\n";
314  ++indent;
315  phase = main;
316  }
318  inline void endMain() {
319  --indent;
320  stream << indent << "</Piece>\n";
321  --indent;
322  stream << indent << "</" << fileType << ">\n";
323  }
324 
326 
343  inline bool beginAppended() {
344  doAppended = factory.beginAppended();
345  if(doAppended) {
346  const std::string& encoding = factory.appendedEncoding();
347  stream << indent << "<AppendedData"
348  << " encoding=\"" << encoding << "\">\n";
349  ++indent;
350  // mark begin of data
351  stream << indent << "_";
352  }
353  phase = appended;
354  return doAppended;
355  }
357  inline void endAppended() {
358  if(doAppended) {
359  stream << "\n";
360  --indent;
361  stream << indent << "</AppendedData>\n";
362  }
363  }
364 
366 
378  template<typename T>
379  DataArrayWriter<T>* makeArrayWriter(const std::string& name,
380  unsigned ncomps, unsigned nitems) {
381  return factory.make<T>(name, ncomps, nitems, indent);
382  }
383  };
384 
385  } // namespace VTK
386 
388 
389 } // namespace Dune
390 
391 #endif // DUNE_GRID_IO_FILE_VTK_VTUWRITER_HH
Default exception class for I/O errors.
Definition: exceptions.hh:229
Utility class for handling nested indentation in output.
Definition: indent.hh:51
a factory for DataArrayWriters
Definition: dataarraywriter.hh:327
DataArrayWriter< T > * make(const std::string &name, unsigned ncomps, unsigned nitems, const Indent &indent)
create a DataArrayWriter
Definition: dataarraywriter.hh:406
bool beginAppended()
signal start of the appended section
Definition: dataarraywriter.hh:362
const std::string & appendedEncoding() const
query encoding string for appended data
Definition: dataarraywriter.hh:375
base class for data array writers
Definition: dataarraywriter.hh:54
Dump a .vtu/.vtp files contents to a stream.
Definition: vtuwriter.hh:96
bool beginAppended()
start the appended data section
Definition: vtuwriter.hh:343
void endAppended()
finish the appended data section
Definition: vtuwriter.hh:357
DataArrayWriter< T > * makeArrayWriter(const std::string &name, unsigned ncomps, unsigned nitems)
acquire a DataArrayWriter
Definition: vtuwriter.hh:379
VTUWriter(std::ostream &stream_, OutputType outputType, FileType fileType_)
create a VTUWriter object
Definition: vtuwriter.hh:120
void endCellData()
finish CellData section
Definition: vtuwriter.hh:218
void beginMain(unsigned ncells, unsigned npoints)
start the main PolyData/UnstructuredGrid section
Definition: vtuwriter.hh:308
void beginCells()
start section for the grid cells/PolyData lines
Definition: vtuwriter.hh:272
void endPointData()
finish PointData section
Definition: vtuwriter.hh:180
void beginCellData(const std::string &scalars="", const std::string &vectors="")
start CellData section
Definition: vtuwriter.hh:203
void beginPointData(const std::string &scalars="", const std::string &vectors="")
start PointData section
Definition: vtuwriter.hh:165
void endPoints()
finish section for the point coordinates
Definition: vtuwriter.hh:247
~VTUWriter()
write footer
Definition: vtuwriter.hh:147
void endCells()
start section for the grid cells/PolyData lines
Definition: vtuwriter.hh:283
void beginPoints()
start section for the point coordinates
Definition: vtuwriter.hh:236
void endMain()
finish the main PolyData/UnstructuredGrid section
Definition: vtuwriter.hh:318
Common stuff for the VTKWriter.
OutputType
How the bulk data should be stored in the file.
Definition: common.hh:40
FileType
which type of VTK file to write
Definition: common.hh:298
@ polyData
for .vtp files (PolyData)
Definition: common.hh:300
@ unstructuredGrid
for .vtu files (UnstructuredGrid)
Definition: common.hh:302
std::string getEndiannessString()
determine endianness of this C++ implementation
Definition: common.hh:278
Data array writers for the VTKWriter.
A few common exception classes.
#define DUNE_THROW(E, m)
Definition: exceptions.hh:216
Utility class for handling nested indentation in output.
Dune namespace.
Definition: alignment.hh:11
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 16, 22:29, 2024)