我正在通过将其网格数据写入可在可视化工具中打开的VTK文件来改进Fortran编写的热工水力学代码。以前,数据只是写入用户必须手动操作的文本文件。我写了两个文件:一个用于标量数据,包括结构化网格单元的顶点和它们内部的标量数据,第二个文件用于矢量数据。由于求解算法,矢量位于网格单元的面上,因此我使用Polydata点定义它们的位置。
我测试了一个小的500格网格的修改,它运行良好,但我已经尝试移动到更大的9,000个网格网格。向量无法正确显示。网格在x方向上具有18个单元,在y方向上具有18个单元,在z方向上具有29个单元。在下面附图中,您可以看到y方向上有18个向量,这是正确的,但在y方向上只有7个向量。我将z方向网格缩小到3级,以降低此处的复杂性。我需要确定这是可视化器,VTK文件还是我的代码的问题。
我检查了VTK文件,它在我看来一切都在那里。实际上,我之前的尝试涉及打印数据,因此z方向坐标变化最快,然后是x,然后是y,并且在z方向上产生交错的矢量集。使它变得如此快速变化,然后y,然后z产生你在上面看到的。我很惊讶地发现这有所不同,因为VTK文件的实际内容没有变化。当然,我写VTK格式有困难,因为我在网上找不到很多关于它的信息,所以我可能会遗漏一些明显的东西。我正在附上我在下面写的VTK文件,看看是否有我忽视的东西。这是一个非常长的文件,所以我删除了这篇文章的大部分数据,只留下了两个标题部分和一些数据点。
# vtk DataFile Version 1.0
Vector Data
ASCII
DATASET POLYDATA
POINTS 972 double
0.33500000E-02 0.33500000E-02 0.00000000E+00
0.13000000E-01 0.33500000E-02 0.00000000E+00
0.25600000E-01 0.33500000E-02 0.00000000E+00
0.38200000E-01 0.33500000E-02 0.00000000E+00
0.50800000E-01 0.33500000E-02 0.00000000E+00
0.63400000E-01 0.33500000E-02 0.00000000E+00
... up to 972 values
POINT_DATA 972
VECTORS Axial_Liquid_Mass_Flow_Rate float
0.0000E+00 0.0000E+00 0.9075E-01
0.0000E+00 0.0000E+00 0.1636E+00
0.0000E+00 0.0000E+00 0.1636E+00
0.0000E+00 0.0000E+00 0.1636E+00
0.0000E+00 0.0000E+00 0.1636E+00
0.0000E+00 0.0000E+00 0.1636E+00
... up to 972 values
参考Chris的评论:
首先,代码实际上使用两个网格与交错网格方法保持一致:1)标量网格,其中连续性和能量方程被解决(压力,密度,焓和空隙分数在中心定义)标量网格单元),2)动量单元网格,其中动量方程被求解(速度在动量网格单元的中心定义)。标量网格由用户定义,并且动量网格构建在其上方,使得动量单元的中心位于标量单元的面上。
我认为使用VTK的直线格式最好捕获这样的网格,但我无法弄清楚如何捕获非正方形或矩形几何体,如下图所示:
因此,我使用了非结构化网格,因为所有单元顶点信息都很容易获得(这也更容易从代码中打印出来,因为我不必考虑单元的连接性)。动量单元实际上将相互重叠,因为它们的设置使得中心位于标量单元面上。因此,只有细胞的中心很重要,这就是我使用点而不是网格来定义速度矢量的原因。如果我添加一些动量网格单元格,请参见上图,如红色虚线所示:
我修改了代码,以便每个标量单元格现在有六个与之关联的数组: 1)x_location(i,j) - 标量网格单元中心的x位置(以米为单位) 2)y_location(i,j) - 标量网格单元中心的y位置 3)z_location(i,j) - 标量网格单元中心的z位置 4)x_size(i,j) - x方向上标量单元的大小 5)y_size(i,j) - y方向上标量单元的大小 6)z_size(i,j) - z方向上标量单元的大小
i索引表示沿z方向堆叠的一列单元(通道)。 j索引表示跨越x,y方向的一层单元格。
可以通过i和j索引唯一地标识单元格。关于这些指数(即密度(i,j),焓(i,j),压力(i,j)等)也给出了所有标量单元数据。