【paraview】XMLフォーマットでVTKファイルを出力

自作コードのシミュレーション結果を可視化するために、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で読み込ませると、下記のような出力ができます。

コメント

タイトルとURLをコピーしました