OpenFOAM blockMesh 圆柱网格及其 paraFoam 绘制面法线

问题描述

OpenFOAM 部分:

我通过 edging blockMesh coding method 在 OpenFOAM 中划分了一个空心圆柱体形状。在该模型中,流动将从外筒壁流向内筒壁;右手法则用于网格点如下:

enter image description here

我试图通过 OpenFOAM 编译的 paraFoam 绘制面部法线,但我不能。可以通过 Glyph 法线绘制边界网格面(位于顶部、底部、内部和外部圆柱壁上),但不能绘制内部网格面。

Q OpenFOAM:是否有任何函数代码方法可以在 paraFoam 中绘制它们?

网格文件已经导出到python里面绘制,如右图。很明显,通过这种方式,起点-终点重叠平面上的网格面与其他旋转面法线相比方向相反。

Q OpenFOAM:这些面法线方向会导致错误的结果吗?或结果仅由右手规则控制?如果需要,是否有任何代码方法可以更改这些方向?

注意:我已经通过 gmsh3D 将这个网格文件导入到 python FiPy 中,并使用它的 facenormals 和 cellCenters 通过 matplotlib 绘制面部法线。

FiPy 部分:

由于我需要使用逆时针 facenormals 方向,我已通过以下代码将顺时针 Start-End 网格面法线方向更改为逆时针方向:

for i in range(self.mesh.numberOfCells):
    for f in self.mesh.cellFaceIDs.data.T[i]:
        if self.mesh.faceCenters().T[f][0] > 0 > self.mesh.facenormals.T[f][1] and self.mesh.faceCenters().T[f][1] == 0:
            self.mesh.facenormals.T[f] = np.multiply(np.array([-1,-1,1]),self.mesh.facenormals.T[f])

Q FiPy:这些面法线方向的变化对 FiPy 求解结果有影响吗? 正如我从最近的 explanation (由于没有足够的声誉法定人数而无法问这个问题) 中的理解,FiPy 认为共享面的细胞面正常方向向外到其对应的相邻单元格和 facenormal 方向(使用 FiPy mesh.Facenormals 在图片显示)本身对解决方案没有影响;这意味着求解器可以根据情况在相反的方向上考虑它。这样对吗??是否有任何 FiPy 网格模块来创建这种 O'grid 圆柱型网格系统,其中可以使用节点的 x、y 和 z 坐标?我曾尝试使用“CylindricalGrid2D”进行径向网格划分,但它仅提供节点的 r 和 z 坐标。

解决方法

关于使用 FiPy 重置 faceNormals 的值。根据网格的类型,这可能是不可能的。例如,使用 Grid2D 样式的网格会导致 AttributeError: can't set attribute,因为法线是在需要时计算的,而不是存储在网格对象中。如果可能的话,它很可能会破坏 FiPy。例如,当 faceNormals 被随机翻转时,下面给出了非常不同的结果。

from fipy import CellVariable,Grid3D,DiffusionTerm
from fipy.meshes.mesh import Mesh
import numpy as np

grid = Grid3D(nx=3,ny=3,nz=1)

mesh = Mesh(grid.vertexCoords,grid.faceVertexIDs,grid.cellFaceIDs)

var = CellVariable(mesh=mesh)

var.constrain(1,where=mesh.facesLeft)
var.constrain(0,where=mesh.facesRight)

DiffusionTerm().solve(var)
print(var)

var[:] = 0.0

flip = 2 * np.random.randint(2,size=mesh.faceNormals.shape[1]) - 1
mesh.faceNormals[:] = mesh.faceNormals * flip[None]

DiffusionTerm().solve(var)
print(var)
,

FiPy 将共享面的 faceNormal 方向考虑向外到相邻单元,

不,如您发布的 link 所述,FiPy 认为 faceNormal 方向是进入面部边界的两个单元格中的第二个单元格。相邻小区是相对于小区的。一张脸有两个边界单元;如果面在外部,则两个边界单元相同。

和 faceNormal 方向(使用 FiPy mesh.FaceNormals 在图片中显示)本身对解决方案没有影响;这意味着求解器可以根据情况在相反的方向上考虑它。是吗??

没有。如@wd15 发布的答案所示,FiPy 在内部使用 faceNormal 并期望它遵守我们定义的约定,即它始终指向第二个单元格。

没有什么可以阻止您使用 FaceVariable 初始化 faceNormals,然后在您认为合适的情况下覆盖某些值:

my_normals = fp.FaceVariable(mesh=mesh,value=mesh.faceNormals,rank=1)
my_normals.setValue(my_desired_orientation,where=my_backward_faces)

是否有 FiPy 网格模块来创建这种 O'grid 圆柱型网格系统,其中节点的 x、y 和 z 坐标可用?

没有