【问题标题】:OpenFOAM blockMesh cylindrical mesh and its paraFoam plotting face normalsOpenFOAM blockMesh 圆柱网格及其 paraFoam 绘制面法线
【发布时间】:2021-07-05 03:37:24
【问题描述】:

OpenFOAM 部分:

我在 OpenFOAM 中网格化了一个空心圆柱体。在这个模型中,流动是从外筒壁流向内筒壁;右手法则用于网格点如下: 我试图通过 OpenFOAM 编译的 paraFoam 绘制面部法线,但我做不到。可以通过 Glyph 法线绘制边界网格面(位于顶部、底部、内部和外部圆柱壁上),但不能绘制内部网格面。

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

Mesh 文件已经导出到 python 里面绘制,如上右图。很明显,这样一来,Start-End 重叠平面上的网格面与其他旋转面法线相比具有相反的方向。

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 方向向外指向其相应的相邻细胞, 和 faceNormal 方向(使用 FiPy mesh.FaceNormals 显示在图片中)本身对解决方案没有影响;这意味着求解器可以根据情况在相反的方向上考虑它。这样对吗??是否有任何 FiPy 网格模块来创建这样的 O'grid 圆柱型网格系统,其中节点的 x、y 和 z 坐标可用?我已经尝试使用“CylindricalGrid2D”进行径向网格划分,但它只给出节点的 r 和 z 坐标。

【问题讨论】:

    标签: mesh paraview normals fipy openfoam


    【解决方案1】:

    关于使用 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 组列表询问。我在这里再次添加了那部分。
    • 通过随机翻转,很可能会导致任何网格类型的错误答案。在您的示例中,作为我的问题,它必须限于内部面孔(因为我的意思是我所谓的“共享面孔”)。使用[mesh.faceNormals.T[face][:] == mesh.faceNormals.T[face] * flip[face] for face in mesh.interiorFaceIDs] 可以给出真实的答案。对于 Start-End 重叠平面,z 大小保持不变(圆柱轴沿 z),但 x 和 y 更改为 -x 和 -y。因此,法线向量的大小将保持不变,但符号相反(法线向量镜像在相应的面上)。
    • 从你的解释和作为先生。 Guyer 的建议是,用 faceNormals 初始化一个 faceVariable 更合乎逻辑,以避免可能出现的不想要的错误结果。
    【解决方案2】:

    FiPy 认为共享面的 faceNormal 方向向外指向相邻单元格,

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

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

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

    没有什么能阻止您使用faceNormals 初始化FaceVariable,然后在您认为合适的时候覆盖一些值:

    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 坐标可用?

    没有。

    【讨论】:

    • 我的问题的一个目的是了解,如果提到的开始-结束重叠平面上的顺时针面法线(不在外部,由 mesh.faceNormals 给出,并且具有相反的与其他人比较的方向)可能会影响或不会影响最终结果。据了解,“mesh.faceNormals”给定法线向量的方向本身不会影响结果,FiPy 将根据约定将其指向相同或相反的方向。对于答案的第一部分,这就是我的意思;我把句子改得更清楚了。
    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多