13#include <vtkCellArray.h>
14#include <vtkCellData.h>
15#include <vtkDoubleArray.h>
17#include <vtkIntArray.h>
18#include <vtkPointData.h>
20#include <vtkUnsignedCharArray.h>
21#include <vtkUnsignedIntArray.h>
24 const std::string &compress_type)
25 : d_compressType(compress_type) {
27 std::string f = filename +
".vtu";
29 d_writer_p = vtkSmartPointer<vtkXMLUnstructuredGridWriter>::New();
30 d_writer_p->SetFileName(
const_cast<char *
>(f.c_str()));
34 const std::vector<util::Point> *u) {
36 auto points = vtkSmartPointer<vtkPoints>::New();
38 for (
size_t i = 0; i < nodes->size(); i++) {
43 points->InsertNextPoint(p.
d_x, p.
d_y, p.
d_z);
46 d_grid_p = vtkSmartPointer<vtkUnstructuredGrid>::New();
47 d_grid_p->SetPoints(points);
51 const std::vector<util::Point> *nodes,
const size_t &element_type,
52 const std::vector<size_t> *en_con,
53 const std::vector<util::Point> *u) {
65 this->appendNodes(nodes, u);
69 size_t num_elems = en_con->size() / num_vertex;
75 auto cells = vtkSmartPointer<vtkCellArray>::New();
76 cells->AllocateEstimate(
static_cast<vtkIdType
>(num_elems),
static_cast<vtkIdType
>(num_vertex));
78 auto cellTypeArray = vtkSmartPointer<vtkUnsignedCharArray>::New();
79 cellTypeArray->SetNumberOfValues(
static_cast<vtkIdType
>(num_elems));
82 for (
size_t i = 0; i < num_elems; i++) {
85 for (
size_t k = 0; k < num_vertex; k++)
86 ids[k] = (*en_con)[num_vertex*i + k];
88 cells->InsertNextCell(
static_cast<int>(num_vertex), ids);
89 cellTypeArray->SetValue(
static_cast<vtkIdType
>(i),
static_cast<unsigned char>(element_type));
92 d_grid_p->SetCells(cellTypeArray, cells);
96 const std::vector<uint8_t> *
data) {
98 auto array = vtkSmartPointer<vtkDoubleArray>::New();
99 array->SetNumberOfComponents(1);
100 array->SetName(name.c_str());
103 for (
unsigned char i : *
data) {
105 array->InsertNextTuple(value);
108 d_grid_p->GetPointData()->AddArray(array);
112 const std::vector<size_t> *
data) {
114 auto array = vtkSmartPointer<vtkDoubleArray>::New();
115 array->SetNumberOfComponents(1);
116 array->SetName(name.c_str());
119 for (
unsigned long i : *
data) {
121 array->InsertNextTuple(value);
124 d_grid_p->GetPointData()->AddArray(array);
128 const std::vector<int> *
data) {
130 auto array = vtkSmartPointer<vtkDoubleArray>::New();
131 array->SetNumberOfComponents(1);
132 array->SetName(name.c_str());
135 for (
int i : *
data) {
137 array->InsertNextTuple(value);
140 d_grid_p->GetPointData()->AddArray(array);
144 const std::vector<float> *
data) {
146 auto array = vtkSmartPointer<vtkDoubleArray>::New();
147 array->SetNumberOfComponents(1);
148 array->SetName(name.c_str());
151 for (
float i : *
data) {
153 array->InsertNextTuple(value);
156 d_grid_p->GetPointData()->AddArray(array);
160 const std::vector<double> *
data) {
162 auto array = vtkSmartPointer<vtkDoubleArray>::New();
163 array->SetNumberOfComponents(1);
164 array->SetName(name.c_str());
167 for (
double i : *
data) {
169 array->InsertNextTuple(value);
172 d_grid_p->GetPointData()->AddArray(array);
176 const std::string &name,
const std::vector<util::Point> *
data) {
178 auto array = vtkSmartPointer<vtkDoubleArray>::New();
179 array->SetNumberOfComponents(3);
180 array->SetName(name.c_str());
182 array->SetComponentName(0,
"x");
183 array->SetComponentName(1,
"y");
184 array->SetComponentName(2,
"z");
187 for (
const auto &i : *
data) {
191 array->InsertNextTuple(value);
194 d_grid_p->GetPointData()->AddArray(array);
198 const std::string &name,
const std::vector<util::SymMatrix3> *
data) {
200 auto array = vtkSmartPointer<vtkDoubleArray>::New();
201 array->SetNumberOfComponents(6);
202 array->SetName(name.c_str());
204 array->SetComponentName(0,
"xx");
205 array->SetComponentName(1,
"yy");
206 array->SetComponentName(2,
"zz");
207 array->SetComponentName(3,
"yz");
208 array->SetComponentName(4,
"xz");
209 array->SetComponentName(5,
"xy");
212 for (
const auto &i : *
data) {
219 array->InsertNextTuple(value);
222 d_grid_p->GetPointData()->AddArray(array);
226 const std::vector<float> *
data) {
227 auto array = vtkSmartPointer<vtkDoubleArray>::New();
228 array->SetNumberOfComponents(1);
229 array->SetName(name.c_str());
232 for (
float i : *
data) {
234 array->InsertNextTuple(value);
237 d_grid_p->GetCellData()->AddArray(array);
241 const std::string &name,
const std::vector<util::SymMatrix3> *
data) {
243 auto array = vtkSmartPointer < vtkDoubleArray > ::New();
244 array->SetNumberOfComponents(6);
245 array->SetName(name.c_str());
247 array->SetComponentName(0,
"xx");
248 array->SetComponentName(1,
"yy");
249 array->SetComponentName(2,
"zz");
250 array->SetComponentName(3,
"yz");
251 array->SetComponentName(4,
"xz");
252 array->SetComponentName(5,
"xy");
255 for (
const auto &i : *
data) {
262 array->InsertNextTuple(value);
265 d_grid_p->GetCellData()->AddArray(array);
270 auto t = vtkDoubleArray::New();
272 t->SetNumberOfTuples(1);
273 t->SetTuple1(0, timestep);
274 d_grid_p->GetFieldData()->AddArray(t);
278 d_writer_p->SetInputData(d_grid_p);
279 d_writer_p->SetDataModeToAppended();
281 d_writer_p->EncodeAppendedDataOff();
282 if (d_compressType ==
"zlib")
283 d_writer_p->SetCompressorTypeToZLib();
285 d_writer_p->SetCompressor(0);
290 const double &
data) {
292 auto t = vtkDoubleArray::New();
293 t->SetName(name.c_str());
294 t->SetNumberOfTuples(1);
295 t->SetTuple1(0,
data);
296 d_grid_p->GetFieldData()->AddArray(t);
302 auto t = vtkDoubleArray::New();
303 t->SetName(name.c_str());
304 t->SetNumberOfTuples(1);
305 t->SetTuple1(0,
data);
306 d_grid_p->GetFieldData()->AddArray(t);
void appendFieldData(const std::string &name, const double &data)
Writes the scalar field data to the file.
void close()
Closes the file and store it to the hard disk.
void appendCellData(const std::string &name, const std::vector< float > *data)
Writes the float data associated to cells to the file.
vtkSmartPointer< vtkXMLUnstructuredGridWriter > d_writer_p
XML unstructured grid writer.
void addTimeStep(const double ×tep)
Writes the time step to the file.
void appendNodes(const std::vector< util::Point > *nodes, const std::vector< util::Point > *u=nullptr)
Writes the nodes to the file.
VtkWriter(const std::string &filename, const std::string &compress_type="")
Constructor.
void appendMesh(const std::vector< util::Point > *nodes, const size_t &element_type, const std::vector< size_t > *en_con, const std::vector< util::Point > *u=nullptr)
Writes the mesh data to file.
void appendPointData(const std::string &name, const std::vector< uint8_t > *data)
Writes the scalar point data to the file.
static int vtk_map_element_to_num_nodes[16]
Map from element type to number of nodes (for vtk)
A structure to represent 3d vectors.
double d_y
the y coordinate
double d_z
the z coordinate
double d_x
the x coordinate