24#ifndef IO_VTK_SURFACE_WRITER_HH
25#define IO_VTK_SURFACE_WRITER_HH
31#include <vtkPointData.h>
32#include <vtkTriangle.h>
33#include <vtkFloatArray.h>
34#include <vtkXMLUnstructuredGridWriter.h>
35#include <vtkXMLPUnstructuredGridWriter.h>
40void vtkSurfaceWriter<T>::init()
42 _grid = vtkSmartPointer<vtkUnstructuredGrid>::New();
43 _points = vtkSmartPointer<vtkPoints>::New();
44 _cells = vtkSmartPointer<vtkCellArray>::New();
45 _localTriangles.clear();
47 std::vector<Cuboid3D<T>*> localCuboids;
48 for (
int globC=0; globC < _cuboidDecomposition.cuboids().size(); ++globC) {
49 if (_loadBalancer.isLocal(globC)) {
50 localCuboids.emplace_back(&_cuboidDecomposition.cuboids()[globC]);
54 std::size_t pointId = 0;
55 for (STLtriangle<T>& triangle : _surfaceI.getMesh().getTriangles()) {
57 bool isTriangleContained =
true;
58 for (
int iD=0; iD < 3; ++iD) {
59 bool isPointContained =
false;
60 for (
auto* cuboid : localCuboids) {
61 if (cuboid->isInside(
triangle.point[iD], 1)) {
62 isPointContained =
true;
66 isTriangleContained &= isPointContained;
69 if (isTriangleContained) {
70 _localTriangles.emplace_back(&triangle);
71 for (
const auto& point :
triangle.point) {
72 _points->InsertNextPoint(point[0], point[1], point[2]);
75 vtkSmartPointer<vtkTriangle> cell = vtkSmartPointer<vtkTriangle>::New();
76 cell->GetPointIds()->SetId(0, pointId++);
77 cell->GetPointIds()->SetId(1, pointId++);
78 cell->GetPointIds()->SetId(2, pointId++);
79 _cells->InsertNextCell(cell);
83 _grid->SetPoints(_points);
84 _grid->SetCells(VTK_TRIANGLE, _cells);
88void vtkSurfaceWriter<T>::write(
int iT)
90 _grid->GetPointData()->Reset();
91 std::vector<vtkSmartPointer<vtkFloatArray>> data(_f.size());
92 for (std::size_t iF=0; iF < _f.size(); ++iF) {
93 data[iF] = vtkSmartPointer<vtkFloatArray>::New();
94 data[iF]->SetName(_f[iF]->
getName().c_str());
95 data[iF]->SetNumberOfComponents(_f[iF]->getTargetDim());
96 _grid->GetPointData()->AddArray(data[iF]);
104 vtkSmartPointer<vtkXMLPUnstructuredGridWriter> multiWriter = vtkSmartPointer<vtkXMLPUnstructuredGridWriter>::New();
105 multiWriter->SetInputData(_grid);
107 multiWriter->SetFileName(filePath.c_str());
108 multiWriter->SetUseSubdirectory(
true);
109 multiWriter->SetStartPiece(0);
111 multiWriter->SetWriteSummaryFile(1);
112 multiWriter->Write();
115 for (
const STLtriangle<T>* triangle : _localTriangles) {
116 for (
const auto& point :
triangle->point) {
117 for (std::size_t iF=0; iF < _f.size(); ++iF) {
118 std::vector<T> result(_f[iF]->getTargetDim(), 0);
119 _f[iF](result.data(), point.data());
120 data[iF]->InsertNextTuple(result.data());
125 vtkSmartPointer<vtkXMLPUnstructuredGridWriter> multiWriter = vtkSmartPointer<vtkXMLPUnstructuredGridWriter>::New();
126 multiWriter->SetWriteSummaryFile(0);
127 multiWriter->SetInputData(_grid);
129 multiWriter->SetFileName(filePath.c_str());
130 multiWriter->SetUseSubdirectory(
true);
133 multiWriter->Write();
std::string getVtkOutDir() const
T triangle(Vector< T, 2 > p, Vector< T, 2 > a, Vector< T, 2 > b, Vector< T, 2 > c) any_platform
Exact signed distance to the surface of two-dimensional triangle.
Directories & directories()
Top level namespace for all of OpenLB.
std::string createFileName(std::string name)
for .pvd masterFile
std::string getName(OperatorScope scope)
Returns human-readable name of scope.