自作コードのシミュレーション結果を可視化するために、XMLフォーマットでの出力方法についてコードを書きました。言語はC++です。
下記の記事を参考にしています。
【paraview】VTKファイルの構造を解説 XMLフォーマット編 | ITとCFD入門チャンネル (itandcfd.com)
下記hsimyuさんが公開しているSimpleVTKを使わせていただきました。
XMLベースのvtk形式に関する覚書 – Qiita
GitHub – hsimyu/SimpleVTK: A C++ header only library to produce XML based vtk files.
出力はUnstructuredGrid形式です。
#include <simple_vtk.hpp>
#include <string>
int main() {
SimpleVTK gen;
std::string test;
test="testvtk";
std::vector<double> position{
0, 0, 0,
1,0,0,
1,1,0,
2,0,0
};
std::vector<int> offsets{
3,6
};
std::vector<int> connectivity{
0, 1, 2,
1, 2, 3
};
std::vector<int> type{
5,5
};
std::vector<float> temp{
0.0,1.0,2.0,3.0
};
std::vector<float> ctemp{
1.0,
5.0
};
gen.beginVTK("UnstructuredGrid");
gen.beginContent();
gen.beginPiece();
gen.setNumberOfPoints(4);
gen.setNumberOfCells(2);
gen.beginPoints();
gen.beginDataArray();
gen.setNumberType("Float32");
gen.setNumberOfComponents(3);
gen.setFormat("ascii");
gen.addVector(position);
gen.endDataArray();
gen.endPoints();
gen.beginCells();
gen.beginDataArray("offsets", "Int32", "ascii");
gen.addVector(offsets);
gen.endDataArray();
gen.beginDataArray("connectivity", "Int32", "ascii");
gen.addVector(connectivity);
gen.endDataArray();
gen.beginDataArray("types", "Int32", "ascii");
gen.addVector(type);
gen.endDataArray();
gen.endCells();
gen.beginPointData();
gen.setScalars("Temperature");
gen.beginDataArray("Temperature", "Float32", "ascii");
gen.addVector(temp);
gen.endDataArray();
gen.endPointData();
gen.beginCellData();
gen.setScalars("Temperature");
gen.beginDataArray("Temperature", "Float32", "ascii");
gen.addVector(ctemp);
gen.endDataArray();
gen.endCellData();
gen.endPiece();
gen.endContent();
gen.endVTK();
gen.generate(test);
return 0;
}
するとこのような形で出力されます。
<?xml version="1.0" ?><VTKFile type="UnstructuredGrid">
<UnstructuredGrid>
<Piece NumberOfPoints="3" NumberOfCells="1">
<Points>
<DataArray type="Float32" NumberOfComponents="3" format="ascii">
0 0 0 1 0 0 1 1 0
</DataArray>
</Points>
<Cells>
<DataArray Name="offsets" type="Int32" format="ascii">
3
</DataArray>
<DataArray Name="connectivity" type="Int32" format="ascii">
0 1 2
</DataArray>
<DataArray Name="types" type="Int32" format="ascii">
5
</DataArray>
</Cells>
<PointData Scalars="Temperature">
<DataArray Name="Temperature" type="Float32" format="ascii">
0 1 2
</DataArray>
</PointData>
<CellData Scalars="Temperature">
<DataArray Name="Temperature" type="Float32" format="ascii">
1
</DataArray>
</CellData>
</Piece>
</UnstructuredGrid>
</VTKFile>
Paraviewで読み込ませると、下記のような出力ができます。
コメント