gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:03:28 26 4
gpt4 key购买 nike

我正在尝试编写一个遗留 .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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com