在OpenFOAM中,点(points)和面(faces)的定义是通过不同的文件来进行的。在案例一级目录下面的constant/polyMesh
目录下,会有points
, faces
, owner
, neighbour
等文件,来描述网格的几何和拓扑结构。时间文件夹下也会有constant/polyMesh/points文件和U文件等。
下面我将解释如何在OpenFOAM中确定点和面,以及它们之间的关系。
一、理解数据文件的含义
1. points
文件
points
文件包含了网格中所有顶点的坐标,每一行代表一个顶点的坐标。
5967
(
(-1.524 0 -1.524)
(-1.29142 0 -1.524)
(-1.08194 0 -1.524)
(-0.893391 0 -1.524)
(-0.723545 0 -1.524)
...
)
代表该数据有5967个顶点,从第1行到5967行分别对应该顶点,从1开始正序排列。
2. faces
文件(在constant/polyMesh下面,该文件只有一个,用来确定点和面的相对关系,具体固体形变的文件在每个时间步下面的ployMesh的points里面)
faces
文件描述了网格中所有面的定义,每一行定义了一个面,由顶点的索引组成。索引从0开始,指向points
文件中的顶点。例如:
999
(
(0 1 2 3)
(4 5 6 7)
...
)
上面的999代表有999个面,意思是,第一个面( 0 1 2 3)由0、1、2、3四个points组成,也就是四个点确定一个面。
3. owner
和 neighbour
文件
owner
和 neighbour
文件描述了每个面所属的单元。owner
文件表示每个面所属于的单元索引,而neighbour
文件则表示每个面相邻的单元索引。
二、确定点和面的关系(数据U和p都在面cell上,不在点上)
为了确定一个面由哪些点组成,你需要查看faces
文件,该文件包含了组成每个面的顶点的索引。这些顶点的坐标可以在points
文件中找到。
要确定上面数据中第一个面由哪些点组成,你可以
- 先查看
faces
文件中第一个条目(也就是第一个面)的顶点号为(0 1 2 3)
, - 然后再在
points
文件中找到这些索引(顶点号)对应的坐标:
即可自己提取到下面的有效数据,也就是第一个面的四个顶点为
- 第0个顶点: (-1.524 0 -1.524)
- 第1个顶点: (-1.29142 0 -1.524)
- 第2个顶点: (-1.08194 0 -1.524)
- 第3个顶点: (-0.893391 0 -1.524)
因此,第一个面由上述四个顶点组成。以此类推,就能得到所有非均匀面的数据。
转换为openfoam的格式,就能在paraview中展示.
使用paraview命令如下:
paraview Fluid.foam
三、分析数据格式
通过下面这个案例
比如这个数据对应的文件结构如下:
文件结构重要结论
这里案例里面Fluid/constant下面的数据是所有时间公用的,是不变得。变的是:
1.polyMesh/points 控制网格的点的变化,从而完全直接控制网格大小的的非均匀变化。(但相相对位置和树数目是不变的,因为constant下面的faces、points等都没有变)
2.time文件夹下的/U,p文件 控制网格的值,比如U、p、cellDisplacements等
通过自己控制变量测试,得到的结论:
这个流固耦合案例,非均匀自适应变化网格的数据:
1.控制弹性固体形状方面变化的:是时间文件夹下面的polyMesh/points文件,里面是5967个点points,所有时间步中的points都是固定的数目(也就是点全局数量一样),只不过偏移量会变化。
points文件
5967
(
(-1.524 0 -1.524)
(-1.29142 0 -1.524)
(-1.08194 0 -1.524)
2.控制U,p等网格值数据变化的:是时间步下面的U文件,所有时间步下面的U文件中的网格数目一致不变化,但是值会变。也就是网格一直是4928个,但该网格的大小和里面的值一直在变化。
U文件
internalField nonuniform List<vector>
4928
(
(-0.000350596 -1.31343e-06 -0.000315693)
(-0.0367326 0.000109503 -0.0520629)
(-2.64343 6.37449e-07 -6.04)
(-71.8074 -4.02119 -117.074)
四、如何预测数据并用这paraview可视化呢
思路:由于Fluid/constant下面的数据不变,也就是只用修改
- 时间文件夹下面的polyMesh/points文件
- 时间文件夹下面的U文件(或者其他想要预测的文件,比如e,p)
第一个文件是points坐标数据,对应5967个三元组,物理意义是5967个点,每个点用3元组表示,shape为(5967,3),加上多个时间,shape(time,5967,3)为这个可以直接用普通的神经网络来预测,或者图神经网络,或者NUNO(非均匀神经算子)。
第二个文件是U的值数据,4928个三元组,物理意义是4928个网格数据,每个网格表示的是U,速度矢量是一个三元组,shape为(4928,3),加上多个时间,shape为(time,4928,3)。这个可以直接用正常的神经网络来预测。
0、模型构建方法:
可以考虑
- 第一个文件用NUNO来预测
- 第二个文件用之前做过的预测流体的WNO(小波神经算子来预测,代码已写完)
也可以直接将 (time,5967,3)和(time,4928,3)合并成一个(time,5967+4928,3),然后用一个模型WNO(小波神经算子)来训练和推理,这样更方便和快捷。
结果1、文件结构处理后用paraview可视化
然后将两个预测的数据接入这个案例的文件格式中,就将times/polyMesh/points和time/U下面的数据更换一下,创建一些时间文件夹里面的内容就可以用paraview正常绘制了。
结果2、不可视化,只想算出error
那就可以直接从上面的文件中提取出两个(time,5967,3)和(time,4928,3)数据用来求error就行了。