BaseVTKWriter.h
Go to the documentation of this file.
1 // This file is part of the MercuryDPM project (https://www.mercurydpm.org).
2 // Copyright (c), The MercuryDPM Developers Team. All rights reserved.
3 // License: BSD 3-Clause License; see the LICENSE file in the root directory.
4 
5 #ifndef VTKWRITER_H
6 #define VTKWRITER_H
7 
8 #include <string>
9 #include <fstream>
10 #include "Logger.h"
11 
16 template<typename H>
18 {
19 
20 public:
21 
22  BaseVTKWriter(H& handler) : handler_(handler)
23  {
24  fileCounter = 0;
25  outputDirectory_ = ".";
26  }
27 
29  {
30  fileCounter = other.fileCounter;
32  }
33 
34  virtual void writeVTK() const = 0;
35 
36  unsigned getFileCounter() const
37  {
38  return fileCounter;
39  }
40 
41  void setFileCounter(unsigned fileCounter)
42  {
43  this->fileCounter = fileCounter;
44  }
45 
46  void setOutputDirectory(const std::string & dir)
47  {
48  logger.assert_always(!dir.empty(), "Invalid VTK directory");
49 
50  if (dir.at(dir.size() - 1) == '/'){
51  outputDirectory_ = dir.substr(0, dir.size() - 1);
52  } else {
53  outputDirectory_ = dir;
54  }
55  }
56 
58  {
59  return outputDirectory_;
60  }
61 
63 
64 protected:
65 
66  std::fstream makeVTKFileWithHeader() const;
67 
68  void writeVTKFooterAndClose(std::fstream& file) const;
69 
72 
73  mutable unsigned int fileCounter;
74 
76 };
77 
78 
80 template<typename T>
82 {
83  //extract the word "Wall" or "Particle" from the VTK writer name
84  std::string name = handler_.getName();
85  name = name.substr(0, name.length() - 7);
86 
87  //determine name of output file
89 #ifdef MERCURYDPM_USE_MPI
90  if (NUMBER_OF_PROCESSORS > 1 && name != "Wall")
91  {
92  fileName = handler_.getDPMBase()->getName() + "Processor_" + std::to_string(PROCESSOR_ID) +
93  '_' + name + '_' + std::to_string(fileCounter) + ".vtu";
94  }
95  else
96  {
97  fileName = handler_.getDPMBase()->getName() +
98  name + '_' +
99  std::to_string(fileCounter) + ".vtu";
100  }
101 #else
102  fileName = handler_.getDPMBase()->getName() +
103  name + '_' +
104  std::to_string(fileCounter) + ".vtu";
105 #endif
106  return fileName;
107 };
108 
109 
111 template<typename T>
113 {
114  std::string fileName = getFileName();
115  fileCounter++;
116 
117  // open output file
118  char filePath[2048];
119  const int n = snprintf(filePath, sizeof(filePath), "%s/%s", outputDirectory_.c_str(), fileName.c_str());
120  if (n <= 0) {
121  logger(ERROR, "unable to create file path");
122  }
123 
124  std::fstream file;
125  file.open(filePath, std::ios_base::out);
126  if (file.fail())
127  {
128  logger(WARN, "File % could not be opened", filePath);
129  }
130 
131  // write output file header
132  file << "<?xml version=\"1.0\"?>\n";
133  file << "<!-- time " << handler_.getDPMBase()->getTime() << "-->\n";
134  file << "<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\">\n";
135  file << "<UnstructuredGrid>\n";
136  return file;
137 }
138 
139 template<typename T>
140 void BaseVTKWriter<T>::writeVTKFooterAndClose(std::fstream& file) const
141 {
142  // write output file footer
143  file << "<Cells>\n";
144  file << " <DataArray type=\"Int32\" Name=\"connectivity\" format=\"ascii\">\n";
145  file << " </DataArray>\n";
146  file << " <DataArray type=\"Int32\" Name=\"offsets\" format=\"ascii\">\n";
147  file << " </DataArray>\n";
148  file << " <DataArray type=\"UInt8\" Name=\"types\" format=\"ascii\">\n";
149  file << " </DataArray>\n";
150  file << "</Cells>\n";
151  file << "</Piece>\n";
152  file << "</UnstructuredGrid>\n";
153  file << "</VTKFile>\n";
154  // close output file
155  file.close();
156 }
157 
158 #endif
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
#define PROCESSOR_ID
Definition: GeneralDefine.h:42
#define NUMBER_OF_PROCESSORS
For the MPI communication routines this quantity is often required. defining this macro makes the cod...
Definition: GeneralDefine.h:41
MatrixXf H
Definition: HessenbergDecomposition_matrixH.cpp:4
Logger< MERCURYDPM_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here.
LL< Log::ERROR > ERROR
Error log level.
Definition: Logger.cc:32
LL< Log::WARN > WARN
Warning log level.
Definition: Logger.cc:33
Definition: BaseVTKWriter.h:18
void setFileCounter(unsigned fileCounter)
Definition: BaseVTKWriter.h:41
BaseVTKWriter(H &handler)
Definition: BaseVTKWriter.h:22
virtual void writeVTK() const =0
const std::string & getOutputDirectory() const
Definition: BaseVTKWriter.h:57
void writeVTKFooterAndClose(std::fstream &file) const
Definition: BaseVTKWriter.h:140
std::string getFileName() const
Definition: BaseVTKWriter.h:81
H & handler_
particle handler from which the particles should be written
Definition: BaseVTKWriter.h:71
std::fstream makeVTKFileWithHeader() const
Definition: BaseVTKWriter.h:112
BaseVTKWriter(const BaseVTKWriter &other)
Definition: BaseVTKWriter.h:28
std::string outputDirectory_
Definition: BaseVTKWriter.h:75
unsigned int fileCounter
Definition: BaseVTKWriter.h:73
unsigned getFileCounter() const
Definition: BaseVTKWriter.h:36
void setOutputDirectory(const std::string &dir)
Definition: BaseVTKWriter.h:46
string fileName
Definition: UniformPSDSelfTest.py:10
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
std::string to_string(T object, unsigned float_precision=8)
Definition: oomph_utilities.h:189
string name
Definition: plotDoE.py:33
std::ofstream out("Result.txt")