零
概述
ParaView 是一个开源的多平台数据分析与可视化应用,广泛应用于科学计算领域中的大规模数据集可视化。下面是paraview中一些模型的可视化效果,包括液体搅拌、波相关和医学扫描数据。
与此同时,ParaView 对有限元结果的可视化也有强大的支持,特别是在处理大型数据集和复杂的网格时。有限元分析通常生成包含节点、单元和物理场变量的数据,这些数据可以通过 ParaView 进行后处理和可视化。
在有限元结果可视化中,网格的可视化是重中之重,网格可大致分为结构化网格和非结构化网格,关于结构化网格的可视化,paraview的帮助文档有详细的说明,这里重点讲解非结构化网格的可视化,兼具标量数据和矢量数据的可视化。
非结构化网格
非结构化网格在处理如汽车、飞机的气动设计、复杂地形的环境模拟、生物医学工程中的器官建模等领域中非常有用,因为这些应用往往涉及到复杂的几何形状和边界条件。尽管非结构化网格的计算成本可能相对较高,但其灵活性和适应性使其成为解决复杂问题的重要工具。
非结构化网格的主要特点包括:
灵活性:可以很好地适应复杂的几何形状,不需要对计算域进行过多的简化或近似。
节点和单元的多样性:网格中的单元可以是三角形、四边形(在二维情况下),或者四面体、六面体、金字塔和楔形等(在三维情况下)。这种多样性使得网格可以针对特定区域进行细化,以提高计算精度。
局部细化:在需要更高精度的区域,可以局部增加网格密度,而不必在整个计算域中均匀细化网格,这样可以有效控制计算成本。
生成和处理的复杂性:由于非结构化网格的灵活性,其生成和处理通常比结构化网格复杂。需要使用专门的算法来生成网格,并且在进行数值计算时,如有限元分析或流体流动模拟,需要处理不同形状和大小的单元。
数据结构:非结构化网格的数据结构通常比结构化网格复杂,需要额外的数据结构来存储单元与节点之间的连接关系。
paraview的vtk文件格式
VTK(Visualization Toolkit)文件格式是 ParaView 中使用的一种重要数据格式,该文件记录了数据集的网格信息、节点坐标信息、标量、矢量和张量等信息,vtk文件有两种格式,分别为二进制和字符型(ASCII 型),ASCII VTK文件是一种文本格式的文件,用于存储和描述数据集,以便于可视化和分析。这种格式对于人类可读和编辑,但通常比二进制格式的文件更大,且读写速度较慢。ASCII VTK文件的结构通常包括以下几个部分:
文件头部:以 # vtk DataFile Version 3.0 开头,指明文件是VTK格式,以及版本号。版本号之后通常会跟随一个描述性的字符串,用于说明数据集的内容或来源。
数据类型:接下来会指定数据集的类型,如 ASCII 或 BINARY。尽管文件是ASCII格式,但这里指明的是文件中数据的存储方式,对于ASCII文件,这一行会是 ASCII。
数据集描述:紧接着是数据集的描述,可以包含任意文本,用于描述数据集的特征或提供其他信息。
数据块(Data Blocks):数据部分开始于 DATASET 关键字,后面跟随数据集的类型,如 STRUCTURED_POINTS、UNSTRUCTURED_GRID、POLYDATA 等。之后是具体的数据定义,包括点(Points)和单元(Cells)的定义,以及可能的关联数据(如标量、向量等)。
点(Points):定义数据集中的几何点,通常以一系列的三元组(x, y, z坐标)表示。
单元(Cells):定义网格的拓扑结构,例如,对于非结构化网格,会列出构成每个单元的点的索引。
数据字段(Data Arrays):可以包含标量、向量或张量数据,这些数据与点或单元相关联。例如,对于一个标量数据,会列出每个点或单元的值。
结束标记:数据部分以 ENDDATA 结束。
下面是一个简单的ASCII VTK文件结构示例
ASCII example
ASCII
DATASET UNSTRUCTURED_GRID
POINTS 3 float
...
CELLS 2 10
...
CELL_TYPES 2
...
CELL_DATA 2
SCALARS cell_scalars float 1
LOOKUP_TABLE default
...
在这个例子中,定义了一个包含3个点的非结构化网格,由一个三角形单元组成。同时,还定义了一个名为 cell_scalars 的标量数据字段,包含两个值,分别对应于网格中的两个单元。
ASCII VTK文件的可读性使得它们在需要手动编辑或调试时非常有用,但因为文件较大且读写速度较慢,对于大规模数据集,二进制格式通常是更好的选择。
非结构化网格示例
下面采用手编的形式讲解非结构化网格在paraview中的显示,该例子包含两个多面体单元,如图所示
这两个正方体的边长均为2,边中间的点均为边中点,方便手编坐标。这一些点的坐标为
下面逐行讲解这两个非结构化单元的vtk文件(文末附有vtk全文)。首先是vtk文件头
vtk from mananul
ASCII
DATASET POLYDATA
第一行是涉及到paraview的版本。
第二行是注释信息,随便写,我这是手动生成的,因此写了:vtk from mananul,第三行的ASCII表示这是一个字符型的vtk文件,最后一行则代表着数据集的类型,这里表示的是多边形数据。
然后是非结构化网格的节点坐标信息。
POINTS 19 float
2 0 0
...
points表示下面的数据集是点,19代表非结构化网格的节点总数,后面的float说明坐标的数据类型,后面的每一行依次是19个节点的xyz坐标。
下面是非结构化网格的面信息。
POLYGONS 15 82
4 0 1 6 4
5 1 2 8 7 6
4 9 8 2 3
4 0 4 9 3
4 0 3 2 1
6 4 5 6 7 8 9
4 4 5 18 17
5 5 6 10 13 18
4 6 7 11 10
4 7 8 12 11
4 10 11 14 13
4 11 12 15 14
4 4 17 16 9
6 13 14 15 16 17 18
5 16 15 12 8 9
POLYGONS 代表下面的数据是非结构化网格的多边形表面信息,一共15个表面,后面的82是所有的表面节点数目总和加上多边形个数,即
82=15(多边形个数)+4(第1个多边形节点数目)+5(第2个多边形节点数目)+...+5(最后一个多边形节点数目)
后面每一行数据的第一个数字是该多边形的节点数目,后面是具体的节点编号,注意节点标号的索引是从零开始的。
为了方便理解,下面给出15个表面的示意图(手指头累断了),三个为一组,一共五组,大家可以跟上面的POLYGONS 数据集对比着看。
上面是非结构化网格的15个多边形表面,下面开始定义节点上的数据,可以是标量,如密度和泊松比等,可以是矢量,如位移、速度和加速度等,在正式开始给节点赋数据之前,要先声明节点数据,如
POINT_DATA 19
19是我这个例子的节点数目,是可变的。下面首先给节点赋予标量数据,如
SCALARS name float 1
LOOKUP_TABLE my_table
1
...
第一行的name是数据量的名称,在paraview中会显示,float说明数据的类型是浮点数,后面的1表示我们这个例子中只有一组标量数据。后面的数据行要和节点数目对应。
下面是两组矢量数据
FIELD FieldData 2
U 3 19 double
1 2 3
...
S 3 19 double
1 2 3
...
这个例子设置了两组矢量数据,分别是:U和S,代表位移和应力。第一行的数据2,即表示有两组数据。第二行和第五行中的3表示该矢量有三个分量,19表示节点数目,double是矢量分量的数据类型。每组矢量后面的数据行行数都是节点数目。
非结构化网格可视化效果
上面的非结构化网格示例在paraview中显示为
上面的示例中,设置了一组标量场,两组矢量场,对于矢量场,paraview会给出自己设计的分量,并且自动计算矢量对应的大小,如U数据,分别给出了xyz分量,和magnitude
对于标量场,paraview直接给出数值,如v数据
上面就是这个简单非结构化网格示例的可视化效果。
非结构化网格vtk文件示例
下面给出了上面手编的非结构化网格示例,里面的标量和矢量数据都是随意设置的,仅仅为了展示文件结构和各关键词的含义,搞清楚了这些,就可以手写程序。vtk文件为
vtk from mananul
ASCII
DATASET POLYDATA
POINTS 19 float
2 0 0
2 2 0
0 2 0
0 0 0
2 0 2
2 1 2
2 2 2
1 2 2
0 2 2
0 0 2
2 2 3
1 2 3
0 2 3
2 2 4
1 2 4
0 2 4
0 0 4
2 0 4
2 1 4
POLYGONS 15 82
4 0 1 6 4
5 1 2 8 7 6
4 9 8 2 3
4 0 4 9 3
4 0 3 2 1
6 4 5 6 7 8 9
4 4 5 18 17
5 5 6 10 13 18
4 6 7 11 10
4 7 8 12 11
4 10 11 14 13
4 11 12 15 14
4 4 17 16 9
6 13 14 15 16 17 18
5 16 15 12 8 9
POINT_DATA 19
FIELD FieldData 2
U 3 19 double
1 2 3
3 4 5
5 6 7
7 8 9
9 10 11
11 12 13
13 14 15
15 16 17
17 18 19
19 20 21
21 22 23
23 24 25
25 26 27
27 28 29
29 30 31
31 32 33
33 34 35
35 36 37
37 38 39
S 3 19 double
1 2 3
3 4 5
5 6 7
7 8 9
9 10 11
11 12 13
13 14 15
15 16 17
17 18 19
19 20 21
21 22 23
23 24 25
25 26 27
27 28 29
29 30 31
31 32 33
33 34 35
35 36 37
37 38 39
SCALARS v float 1
LOOKUP_TABLE my_table
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
paraview功能强大,上面只是非常简单的非结构化网格示例,仅仅涉及到paraview基本的功能,还有张量可视化等更加复杂的功能,大家可自行探索。
点击卡片 关注我们