Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 创建为Polydata VTK文件的向量在访问中未正确显示_Fortran_Visualization_Vtk - Fatal编程技术网

Fortran 创建为Polydata VTK文件的向量在访问中未正确显示

Fortran 创建为Polydata VTK文件的向量在访问中未正确显示,fortran,visualization,vtk,Fortran,Visualization,Vtk,我正在改进用Fortran编写的热工水力学代码,让它将网格数据写入可以在可视化工具中打开的VTK文件。以前,数据只是简单地写入一个文本文件,用户必须手动操作。我写了两个文件:一个用于标量数据,其中包括结构化网格单元的顶点和其中的标量数据,第二个用于矢量数据。由于求解算法,向量位于网格单元的面上,因此我使用多边形数据点定义它们的位置 我在一个500个小网格上测试了我的修改,效果很好,但我试着升级到一个更大的9000个网格。向量显示不正确。网格在x方向上有18个单元,在y方向上有18个单元,在z方向

我正在改进用Fortran编写的热工水力学代码,让它将网格数据写入可以在可视化工具中打开的VTK文件。以前,数据只是简单地写入一个文本文件,用户必须手动操作。我写了两个文件:一个用于标量数据,其中包括结构化网格单元的顶点和其中的标量数据,第二个用于矢量数据。由于求解算法,向量位于网格单元的面上,因此我使用多边形数据点定义它们的位置

我在一个500个小网格上测试了我的修改,效果很好,但我试着升级到一个更大的9000个网格。向量显示不正确。网格在x方向上有18个单元,在y方向上有18个单元,在z方向上有29个单元。在我下面附上的图片中,您可以看到y方向上有18个向量,这是正确的,但y方向上只有7个向量。我将z方向网格减少到3个级别,以降低此处的复杂性。我需要确定这是可视化工具、VTK文件还是我的代码的问题

我检查了VTK文件,在我看来一切都在那里。实际上,我之前的尝试涉及到打印数据,所以z方向坐标变化最快,然后是x,然后是y,这在z方向上产生了一组交错的向量。使x变化最快,然后是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
关于克里斯的评论:

首先,代码实际上使用了两个网格,与交错网格方法一致:1)在其中求解连续性和能量方程的标量网格(在标量网格单元的中心定义压力、密度、焓和空隙率),2)在其中求解动量方程的动量单元网格(速度在动量网格单元的中心定义)。标量网格由用户定义,动量网格构建在其上,以便动量单元的中心位于标量单元的面上

我认为最好使用VTK的直线格式捕获此类网格,但我不知道如何捕获非方形或矩形几何体,如下图所示:

因此,我使用了非结构化网格,因为所有单元格垂直信息都很容易获得(这也更容易从代码中打印出来,因为我不必考虑单元格的连通性)。动量单元实际上会相互重叠,因为它们的设置使中心位于标量单元面上。因此,只有单元的中心才是重要的,这就是为什么我使用点而不是网格来定义速度向量。如果我添加一些动量网格单元,请参见上图,如红色虚线所示线路:

我修改了代码,使每个标量单元现在有六个与其关联的数组: 1) x_位置(i,j)-标量网格单元中心的x位置,以米为单位 2) y_位置(i,j)-标量网格单元中心的y位置 3) z_位置(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)等)的。

虽然不是您问题的答案,但我不认为POLYDATA数据集是最合适的选择。您的数据似乎是在常规网格上定义的,因此使用直线或结构化网格会更容易。另外,你说你的向量是在网格单元的面上定义的,所以你应该使用单元数据,而不是点数据。最后,您提供的示例VTK文件无效(我认为是因为972的值)。网格实际上是在标量数据VTK文件中定义的。这是通过非结构化网格实现的。起初我试过直线,但我的几何体并不总是正方形或长方形,我也不知道如何使直线适用于那些不同的几何体。我确实开始使用细胞数据,但载体都来自同一点。一个单元将有6个向量与其关联,每个向量对应于单元的每个面,但单元是连接的,因此向量不应重复计数。在网格中布置所有点似乎更容易。结构化网格可以有您喜欢的任何几何体,但它假设相邻单元连接,而非结构化网格则没有。我想这是你最好的选择。你能在你的问题中包括坐标是如何定义的,以及标量和向量是如何定义的(用Fortran语言)?出于好奇,如果向量文件中没有网格,如何在VisIt中绘制向量?