h5

出典:h5cpp/docs/USAGE-visualization.md

h5cpp の可視化出力

h5cpp から可視化用の HDF5 を書く方法を扱います。API 全般は USAGE.md、ファイル形式は h5c の FORMAT.md を参照してください。

XDMF は h5cpp では生成しません。HDF5 を出力したあと、独立ツールの h5xdmf で XDMF3 に変換します。

二つのライター

型 ヘッダー 用途
h5cpp::viz h5cpp/h5cpp_viz.hpp 逐次出力
h5cpp::parallel_viz h5cpp/h5cpp_viz_mpi.hpp 並列出力、communicator を取る

parallel_viz は viz を継承し、communicator を受け取るコンストラクタだけを 追加しています。書き込み・offsets()・close() はすべて継承したものなので、 構築したあとの使い方は同一です。並列ビルドでは両方を同時に使えます。

逐次出力

#include <h5cpp/h5cpp_viz.hpp>

h5cpp::viz out("result/seq000000.h5", time);
h5cpp::viz_mesh mesh{h5cpp::viz_kind::unstructured, "fluid",
                     "Tetrahedron", 4, npoints, ncells};
out.begin_mesh(mesh);
out.write_nodes<double>({x, y, z});        // 各成分は vector または span
out.write_connectivity(connectivity);      // 整数 vector
out.write_point_data<double>("Velocity", {u, v, w});
out.close();

write_nodes()、write_point_data()、write_cell_data() は、平坦な vector、 ポインタ、成分ごとの span を受け取ります。平坦な field を渡す場合は成分数も 指定します。write_connectivity() も同じ入力形式に対応します。

offsets() は現在のメッシュの point / cell offset、status() は最初の失敗を 返します。

並列出力

ヘッダーと型を変えるだけで、以降の呼び出しは逐次と同じです。

#include <h5cpp/h5cpp_viz_mpi.hpp>

h5cpp::parallel_viz out("result/seq000000.h5", time, comm, info);

comm の既定値は MPI_COMM_WORLD、info は MPI_INFO_NULL です。 status() を除く I/O 操作は collective なので、全ランクが同じ順序で 同じ名前に対して呼びます。

メッシュの入力条件、節点番号の扱い、点群の扱いは h5c の可視化ガイド を参照してください。ランクローカルな 0 始まりの connectivity を渡し、 ライターがオフセットを加える点は h5c と同じです。

所有権

デストラクタは例外を投げずに閉じます。閉じる際の失敗を検出するには、 明示的に close() を呼んでください。並列オブジェクトは全ランクで close を そろえ、MPI の終了前に破棄します。

旧 API からの移行

viz と parallel_viz が別の型になったため、以前の呼び出しは書き換えが必要です。

旧 新
viz(path, time, comm) parallel_viz(path, time, comm)
並列用途での viz(path, time) parallel_viz(path, time)

h5cpp_viz.hpp は MPI ヘッダーを読み込まなくなったので、並列出力を使うコードは h5cpp_viz_mpi.hpp を include してください。

次に読むもの