Fipy calcNormals 函数

问题描述

我有一个关于Fipy中facenormals计算的问题: 似乎每个面的法向量都指向相同的方向,除非面位于网格的 x、y 和 z 轴的末端之一(在这种情况下,它们指向相反的方向)与其他法向量)。这样,法线始终指向单元格的内部。为什么是这样?如果所有法线都指向同一个方向(即最后一个法线指向网格的外部),这会产生什么效果。 这是(作为解释)计算 1D 非均匀网格法线的代码,但 2D 和 3D 网格和网格的原理似乎相同:

    def _calcFacenormals(self):
        facenormals = numerix.array((numerix.ones(self.numberOfFaces,'d'),))
        # The left-most face has neighboring cells None and the left-most cell.
        # We must reverse the normal to make fluxes work correctly.
        if self.numberOfFaces > 0:
            facenormals[...,0] = -facenormals[...,0]
        return facenormals

对于非均匀 3D 网格,法线应该指向单元格的中心还是只是指向内部(长度为 1)?

每个面的法线用于计算对流和扩散流的方向和速度,这是正确的吗?

在这种情况下,网格的最后一个法线指向另一个方向而不是其他方向这一事实会导致边界处通量计算的错误,不是吗?

感谢您的帮助!

解决方法

正如代码中的注释所说

# The left-most face has neighboring cells None and the left-most cell.
# We must reverse the normal to make fluxes work correctly.

FiPy 的实现使得 faceNormals 始终 指向人脸两侧的两个单元格中的第二个单元格。对于 Grid1D 中最右侧的单元格,右侧没有单元格,因此第一个和第二个单元格相同且 faceNormals 指向左侧。同样的注意事项适用于任何外表面。

看起来我们打算区分 .faceNormals._orientedFaceNormals,但我看不出它们有什么不同。

注意:方法以“_”作为 'weak "internal use" indicator' 开头。这些是实现细节,您不应该调用它们。这对于像“._calcSomething()”这样的方法来说是加倍的。这些始终是您应该使用的属性 .something 背后的主力军。如果您发现需要调用这些内部方法,请告诉我们,以便我们可以扩充我们的公共 API。