c - 编写 VTK ASCII 遗留文件以在 VisIt 中绘制轮廓

标签 c vtk contour

我正在尝试编写一个遗留 .vtk 文件以使用 C 读入 VisIt。不幸的是,我安装的 VisIt 程序拒绝呈现我编写的 VTK 文件,阅读:'本地主机失败了'

下面是用于从一个文件中读取数据并将其转换为遗留 VTK 文件的代码。我使用宏 XPIXYPIXZPIX 来描述像素网格的尺寸。每个像素包含一个标量密度值。我已经使用行优先排序在“网格文件”中列出了像素:即

int list_index(x,y,z) = YPIX * ZPIX * x + ZPIX * y + z;

此像素列表中的每个条目都被读入名为 grid[] 的 double 类型数组,并写入遗留 VTK header 数据下方的 outfile:

/*Write vtk header */                                                           
fprintf(outfile,"# vtk DataFile Version 3.0\n");                                
fprintf(outfile,"Galaxy density grid\nASCII\nDATASET STRUCTURED_POINTS\n");     
fprintf(outfile,"DIMENSIONS %d %d %d \n", (XPIX+1), (YPIX+1), (ZPIX+1));        
fprintf(outfile,"ORIGIN 0 0 0\n");                                              
fprintf(outfile,"SPACING 1 1 1\n");//or ASPECT_RATIO                            
fprintf(outfile,"CELL_DATA %d\n", totalpix);                                    
fprintf(outfile,"SCALARS cell_density float 1\n");                              
fprintf(outfile, "LOOKUP_TABLE default\n");                                     

/*Create Memory Space to store Pixel Grid*/                                     
double *grid;                                                                   
grid = malloc(XPIX * YPIX * ZPIX * sizeof(double));                             
if (grid == NULL ){                                                             
  fprintf(stderr, "Pixel grid of type double failed to initialize\n");          
  exit(EXIT_FAILURE);                                                           
}                                                                               
fprintf(stderr,"Pixel grid has been initialized.\n Now reading infile\n");      

/*Read infile contents into double grid[], using Row-Major Indexing*/           
double rho;                                                                     
char newline;                                                                   
int i, j, k;                                                                    
for(i = 0; i < XPIX; i++){                                                      
  for(j = 0; j < YPIX; j++){                                                    
    for(k = 0; k < ZPIX; k++){                                                  
      fscanf(infile, "%lf", &rho);                                              
      grid[getindex(i,j,k)] = rho;                                              
    }                                                                           
  }                                                                             
  fprintf(stderr,"%d\n", i);                                                    
}                                                                               
fprintf(stderr,"Finished reading\n");                                           

#if !DEBUG                                                                      
/*Write out grid contents in Row major order*/                                  
fprintf(stderr,"Now writing vtk file");                                         
for(i = 0; i < XPIX; i++){                                                      
  for(j = 0; j < YPIX; j++){                                                    
    for(k = 0; k < ZPIX; k++){                                                  
      fprintf(outfile, "%lf ", grid[getindex(i,j,k)]);                          
    }                                                                           
    fprintf(outfile,"\n");                                                      
  }                                                                             
}                                                                               
fprintf(stderr,"Finished Writing to outfile\n");                                
#endif  

通过此例程运行网格数据列表后,我在 lookup_table 中有 XPIX*YPIX 行,每行都有 ZPIX 条目。这是一种不正确的格式吗? VisIt 继续无法读取输入文件。我知道 structured_points 可能使用主要列索引,但我的首要目标当然是从 VisIt 获得某种结果。我想最终使用标量 cell_density 绘制轮廓。我的数据集是不是太大了?

最佳答案

您是否看过问题 vtk data format error 的已接受答案? ?问题是用 C++ 调试 VTK 编写器,但它与您的代码非常相似(当然应该产生相同的结果)。

已接受答案的关键点是数据是按列主要顺序写入的,不是行主要顺序(您似乎在问题中暗示了这一点:“我知道 structured_points 可能会使用列主索引”)。

此外,将您的代码与您知道有效的代码进行比较总是有帮助的(如果可以的话)。例如,VisIt 提供了一个小型 C 库,用于编写名为 VisItWriterLib 的遗留 VTK 文件格式。 .比较代码和 VisItWriterLib 的输出以查看数据文件的不同之处。我建议为您的 VTK IO 使用 VisItWriterLib 而不是编写您自己的例程 - 无需重新发明轮子。

编辑:回答您的其他几个问题:

After running the grid data list through this routine, I have XPIX*YPIX lines in the lookup_table, each with ZPIX entries. Is this an incorrect format?

不是正确的格式。 LOOKUP_TABLE 应该是 XPIX*YPIX*ZPIX 行的列表,每行一个元素(或者,VisIt 将接受一行 XPIX*YPIX*ZPIX 元素)。请参阅 VTK 文件格式文档 (www.vtk.org/VTK/img/file-formats.pdf) 中的数据集属性格式部分。

Is my data set simply too large?

我怀疑。 VisIt 旨在处理巨大 数据集,据我所知,可以呈现 PB 数据集。如果您的数据那么大,我会感到非常惊讶。

但是,如果您担心拥有大文件,您可以将数据拆分为多个文件并告诉 VisIt 并行读取这些文件。为此,请将您的数据写入单独的文件中,例如domain1.vtk, domain2.vtk, ... domainN.vtk 等等 然后写个.visit master文件,其结构为

!NBLOCKS N
domain1.vtk
domain2.vtk
...
domainN.vtk

例如,将其另存为 mydata.visit,然后打开此 .visit 文件,而不是 .vtk 文件,在访问。

关于c - 编写 VTK ASCII 遗留文件以在 VisIt 中绘制轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8791446/

相关文章:

c - 隐式释放

python - matplotlib 中具有 2 个不同步长的等值线图

r - 如何计算R中轮廓线内的面积?

linux - 如何启用 vtk "direct"硬件渲染,X11/Ubuntu 11.04 x86-64?

c++ - 如何解释VtkCamera viewTransformMatrix

python - VTK 与真正的 X 一起工作,与 Xvfb 一起崩溃

javascript - d3 selectAll.remove() 与 d3.select.remove() 相比是滞后的

c++ - C++中的**是什么

c++ - 是一个堆栈指针伪随机数的良好来源

c - 通过 fork 进程将输出写入标准输出