dune-grid  2.2.0
vtuwriter.hh
Go to the documentation of this file.
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 
10 #include <dune/common/exceptions.hh>
11 #include <dune/common/indent.hh>
12 
15 
16 namespace Dune {
17 
20 
21  namespace VTK {
22 
24 
97  class VTUWriter {
98  public:
99  std::ostream& stream;
101 
102  private:
103  DataArrayWriterFactory factory;
104  Indent indent;
105 
106  std::string fileType;
107  std::string cellName;
108 
109  bool doAppended;
110 
111  public:
113 
121  inline VTUWriter(std::ostream& stream_, OutputType outputType,
122  FileType fileType_)
123  : stream(stream_), factory(outputType, stream)
124  {
125  switch(fileType_) {
126  case polyData:
127  fileType = "PolyData";
128  cellName = "Lines";
129  break;
130  case unstructuredGrid:
131  fileType = "UnstructuredGrid";
132  cellName = "Cells";
133  break;
134  default:
135  DUNE_THROW(IOError, "VTUWriter: Unknown fileType: " << fileType_);
136  }
137  const std::string& byteOrder = getEndiannessString();
138 
139  stream << indent << "<?xml version=\"1.0\"?>\n";
140  stream << indent << "<VTKFile"
141  << " type=\"" << fileType << "\""
142  << " version=\"0.1\""
143  << " byte_order=\"" << byteOrder << "\">\n";
144  ++indent;
145  }
146 
148  inline ~VTUWriter() {
149  --indent;
150  stream << indent << "</VTKFile>\n"
151  << std::flush;
152  }
153 
155 
166  inline void beginPointData(const std::string& scalars = "",
167  const std::string& vectors = "") {
168  switch(phase) {
169  case main:
170  stream << indent << "<PointData";
171  if(scalars != "") stream << " Scalars=\"" << scalars << "\"";
172  if(vectors != "") stream << " Vectors=\"" << vectors << "\"";
173  stream << ">\n";
174  ++indent;
175  break;
176  case appended:
177  break;
178  }
179  }
181  inline void endPointData() {
182  switch(phase) {
183  case main:
184  --indent;
185  stream << indent << "</PointData>\n";
186  break;
187  case appended:
188  break;
189  }
190  }
191 
193 
204  inline void beginCellData(const std::string& scalars = "",
205  const std::string& vectors = "") {
206  switch(phase) {
207  case main:
208  stream << indent << "<CellData";
209  if(scalars != "") stream << " Scalars=\"" << scalars << "\"";
210  if(vectors != "") stream << " Vectors=\"" << vectors << "\"";
211  stream << ">\n";
212  ++indent;
213  break;
214  case appended:
215  break;
216  }
217  }
219  inline void endCellData() {
220  switch(phase) {
221  case main:
222  --indent;
223  stream << indent << "</CellData>\n";
224  break;
225  case appended:
226  break;
227  }
228  }
229 
231 
237  inline void beginPoints() {
238  switch(phase) {
239  case main:
240  stream << indent << "<Points>\n";
241  ++indent;
242  break;
243  case appended:
244  break;
245  }
246  }
248  inline void endPoints() {
249  switch(phase) {
250  case main:
251  --indent;
252  stream << indent << "</Points>\n";
253  break;
254  case appended:
255  break;
256  }
257  }
258 
260 
273  inline void beginCells() {
274  switch(phase) {
275  case main:
276  stream << indent << "<" << cellName << ">\n";
277  ++indent;
278  break;
279  case appended:
280  break;
281  }
282  }
284  inline void endCells() {
285  switch(phase) {
286  case main:
287  --indent;
288  stream << indent << "</" << cellName << ">\n";
289  break;
290  case appended:
291  break;
292  }
293  }
294 
296 
309  inline void beginMain(unsigned ncells, unsigned npoints) {
310  stream << indent << "<" << fileType << ">\n";
311  ++indent;
312  stream << indent << "<Piece"
313  << " NumberOf" << cellName << "=\"" << ncells << "\""
314  << " NumberOfPoints=\"" << npoints << "\">\n";
315  ++indent;
316  phase = main;
317  }
319  inline void endMain() {
320  --indent;
321  stream << indent << "</Piece>\n";
322  --indent;
323  stream << indent << "</" << fileType << ">\n";
324  }
325 
327 
344  inline bool beginAppended() {
345  doAppended = factory.beginAppended();
346  if(doAppended) {
347  const std::string& encoding = factory.appendedEncoding();
348  stream << indent << "<AppendedData"
349  << " encoding=\"" << encoding << "\">\n";
350  ++indent;
351  // mark begin of data
352  stream << indent << "_";
353  }
354  phase = appended;
355  return doAppended;
356  }
358  inline void endAppended() {
359  if(doAppended) {
360  stream << "\n";
361  --indent;
362  stream << indent << "</AppendedData>\n";
363  }
364  }
365 
367 
379  template<typename T>
380  DataArrayWriter<T>* makeArrayWriter(const std::string& name,
381  unsigned ncomps, unsigned nitems) {
382  return factory.make<T>(name, ncomps, nitems, indent);
383  }
384  };
385 
386  } // namespace VTK
387 
389 
390 } // namespace Dune
391 
392 #endif // DUNE_GRID_IO_FILE_VTK_VTUWRITER_HH