Fipy calcNormals 函数

Posted

技术标签:

【中文标题】Fipy calcNormals 函数【英文标题】:Fipy calcNormals function 【发布时间】:2021-04-01 09:45:23 【问题描述】:

我有一个关于在 Fipy 中计算 faceNormals 的问题: 看起来每个面的法线向量都指向相同的方向,除非面位于网格的 x、y 和 z 轴的末端之一(在这种情况下,它们指向相反的方向)与其他法线向量)。这样,法线总是指向单元的内部。为什么是这样?如果所有法线都指向同一个方向(即最后一条法线将指向网格的外部),这会产生什么效果。 这是(作为解释)计算一维非均匀网格的法线的代码,但原理似乎与 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)?

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

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

感谢您的帮助!

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于Fipy calcNormals 函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥在尝试安装 FiPy 时出现错误?

细胞变量*fipy中的扩散

安装FiPy时出错“命令”python setup.py egg_info“失败,错误代码为1”

Numpy中的三个常用正态分布函数randn,standard_normal, normal的区别

计算顶点法线OpenGL

如何在 PyBrain 中使用函数 normalize()?