1

我正在尝试使用 VTK(绘制彩色等值面)可视化我存储在常规网格上的一些数据。我编写了一些代码以 vtk 旧格式转储数据,该格式适用于低分辨率版本的数据。我可以使用 ParaView 或 VTK 库提取和查看预期的等值面。当我在每个维度上将分辨率提高 10 倍时(nx 从大约 100 到 1000,与 ny、nz 相同),paraview 和我使用 VTK 库编写的查看器是不正确的。它们看起来像一组稍微偏轴的薄片,而不是单个“斑点”。我从其他测试中知道数据本身是正确的。

下面我的旧版 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中查看您的数据文件后,我猜想您编写点数据的方法不正确(您的三个嵌套 for 循环 - 将数据从 3D 展平为 1D 列表)。

我建议你用你的 VTK 编写器和这个简单的 C 代码编写一些小的测试数据集,它是随 VisIt 提供的,用于编写遗留的 VTK 文件。确保使用这两种方法编写的数据集完全一致(请注意,VisItWriterLib.c 编写的是版本 2 VTK 文件格式,而您使用的是版本 3 - 但是这不会导致问题)。

编辑:正如评论中所讨论的,问题在于嵌套 for 循环的顺序,这些循环用于输出点数据并将其从 3D 展平为 1D 列表。编码

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 回答