出典: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 してください。