1

VTK(色付きの等値面の描画)を使用して、通常のグリッドに保存したデータを視覚化しようとしています。低解像度バージョンのデータで機能するvtkレガシー形式でデータをダンプするコードをいくつか作成しました。ParaViewまたはVTKライブラリを使用して、予想される等値面を抽出して表示できます。各次元で解像度を10倍に上げると(nxは約100から1000になり、ny、nzと同じ)、VTKライブラリを使用して作成したparaviewとビューアは正しくありません。それらは、単一の「ブロブ」ではなく、わずかに軸から外れたシートのセットのように見えます。他のテストから、データ自体が正しいことがわかります。

以下の私のレガシーvtkフォーマットのダンプコードに何か問題がありますか?ルックアップテーブルの機能はわかりませんが、低解像度の場合は問題なく機能するようです。

std::ofstream out(filename);

out << "# vtk DataFile Version 3.0" << std::endl;
out << "Signed distance/biharmonic visualizer" << std::endl;
out << "ASCII" << std::endl;
out << "DATASET STRUCTURED_POINTS" << std::endl;
out << "DIMENSIONS " << nx << " " << ny << " " << nz << std::endl;
out << "ORIGIN 0 0 0" << std::endl;
out << "SPACING " << h << " " << h << " " << h << std::endl;
out << "POINT_DATA " << nx*ny*nz << std::endl;
out << "SCALARS signedDistance double" << std::endl;
out << "LOOKUP_TABLE default" << std::endl;
for(size_t i = 0; i < nx; ++i)
  for(size_t j = 0; j < ny; ++j)
    for(size_t k = 0; k < nz; ++k)
      out << tempPhi(i,j,k) << std::endl;
out << "SCALARS biharmonic double" << std::endl;
out << "LOOKUP_TABLE default" << std::endl;
for(size_t i = 0; i < nx; ++i)
  for(size_t j = 0; j < ny; ++j)
    for(size_t k = 0; k < nz; ++k)
      out << biharmonic(i,j,k) << std::endl;
out.close();
4

1 に答える 1

2

提供するVTKファイルには、が多数出現し1.79769e+308ます。実際にデータを「見る」には、これらをゼロに置き換える必要がありました。これを実行し、VisItでデータファイルを確認したところ、ポイントデータの書き込み方法が正しくないと思います(3つのネストされたforループ-3Dから1Dリストにデータをフラット化します)。

VTKライターと、レガシーVTKファイルを書き込むためにVisItに付属しているこの単純なCコードを使用して、いくつかの小さなテストデータセットを作成することをお勧めします。両方のメソッドで書き込まれたデータセットが正確に一致することを確認してください(VisItWriterLib.cはバージョン2のVTKファイル形式を書き込むのに対し、バージョン3を使用することに注意してください。ただし、これによって問題が発生することはありません)。

編集:コメントで説明したように、問題は、ポイントデータを出力し、それを3Dから1Dリストにフラット化するために使用されるネストされたforループの順序でした。コード

for(size_t i = 0; i < nx; ++i)
  for(size_t j = 0; j < ny; ++j)
    for(size_t k = 0; k < nz; ++k)
      out << tempPhi(i,j,k) << std::endl;

実際に読む必要があります

for(size_t k = 0; k < nz; ++k)
  for(size_t j = 0; j < ny; ++j)
    for(size_t i = 0; i < nx; ++i)
      out << tempPhi(i,j,k) << std::endl;

つまり、データは行メジャーではなく、メジャー順に書き込む必要があります。これは、VTKファイル形式のドキュメントが不足している点です。

于 2011-12-08T11:30:42.550 に答える