1

我正在尝试.vtk使用 C 编写要读入 VisIt 的旧文件。不幸的是,我安装的 VisIt 程序拒绝呈现我正在编写的 VTK 文件,阅读:“本地主机失败”

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

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

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

/*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  

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

4

1 回答 1

2

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

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

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

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

通过此例程运行网格数据列表后,我在 lookup_table 中有 XPIX*YPIX 行,每行都有 ZPIX 条目。这是不正确的格式吗?

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

我的数据集是否太大?

我对此表示怀疑。VisIt 旨在处理庞大的数据集,AFAIK 可以渲染 PB 数据集。如果您的数据那么大,我会感到非常惊讶。

但是,如果您担心文件很大,您可以将数据拆分为多个文件并告诉 VisIt 以并行方式读取这些文件。为此,请将您的数据写入单独的文件,例如domain1.vtk, domain2.vtk, ...domainN.vtk等。然后编写一个.visit主文件,该文件具有以下结构

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

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

于 2012-01-09T16:25:07.677 回答