如何计算网格的偏度?

计算科学 有限体积 开放式泡沫 非结构化网格
2021-12-08 22:55:47

我正在编写一个代码来计算网格质量统计信息,例如:细胞体积、面面积和面之间的非正交性(基本上类似于 OpenFOAM 的checkMesh)。

根据F. Moukalled 等人的说法,当连接相邻细胞质心的线不通过连接两个细胞的跨面的质心时,网格就会倾斜。例如,如果面质心由表示,并且是连接两个单元的线与面之间的交点,则对于非倾斜网格重合。ffff

那么,衡量偏度的指标是什么?

我发现以下代码在 OpenFOAM 中用于计算偏度,但其背后的数学不是很清楚:

注意:/* */评论是我的,但是,我不能 100% 确定我对变量的解释。

/* fCtrs[facei] is the face centroid of the current straddling face */
/* ownCc is the centroid of the cell that owns facei */
/* neiCc is the centroid of the neighbor cell */

vector Cpf = fCtrs[facei] - ownCc;
vector d = neiCc - ownCc;

// Skewness vector
/* the & operator is an overloaded operator that represents dot product */
/* ROOTVSMALL is a constant, equals "1.0e-18" (defined somewhere else), that prevent errors when dividing by zero */
/* fAreas[facei] returns the area normal vector of the straddling face */
vector sv =
    Cpf
    - ((fAreas[facei] & Cpf)/((fAreas[facei] & d) + ROOTVSMALL))*d;

vector svHat = sv/(mag(sv) + ROOTVSMALL);
1个回答

从讨论和论文来看,OpenFOAM 似乎已经实施了偏度测量。这个答案不能解释为什么不同的偏度定义可能是等价的,我只是要证明为什么这是一种偏度的度量。考虑以下两个元素 - 为了简单起见 -

在此处输入图像描述

蓝色箭头是外表面法线fAreas[facei],红点是,从左到右ownCcfCtrs[facei]neiCc现在,Cpf是从 指向 的向量ownCcfCtrs[facei]是从指向d的向量fCtrs[facei]neiCc

这就是我要提醒的地方,给定两个兼容的向量其中之间的角度v,w

vw=v w cos(θ)
θvw

让我们回到公式((fAreas[facei] & Cpf)/((fAreas[facei] & d) + ROOTVSMALL))(fAreas[facei] & Cpf)只会给我们时间的范数,fAreas[facei]因为Cpf这两个向量指向相同的方向(在这个例子中,如果Own是梯形,它就不会)因此可能会给我们各种不同的正值,但重要的是如果指向同一方向,因此没有偏斜,这将是时代的常态,例如这简化了θ=0(fAreas[facei] & d)fAreas[facei]dfAreas[facei]d[norm(fAreas[facei])*norm(Cpf)]/[norm(fAreas[facei])*norm(d)] = norm(Cpf)/norm(d)

sv = Cpf - ((fAreas[facei] & Cpf)/((fAreas[facei] & d) + ROOTVSMALL))*d;

进入

sv = Cpf - norm(Cpf)*d/norm(d); // Note that d/norm(d) is a unit vector pointing
                                // in the same direction as Cpf.

进入

sv = Cpf - Cpf; // e.g. zero vector

因此,如果网格没有倾斜,sv- 结果svHat- 将为零。如果它是倾斜的,如图所示,数学略有不同

sv = Cpf - ((fAreas[facei] & Cpf)/((fAreas[facei] & d) + ROOTVSMALL))*d;

变成

sv = 
 Cpf - 
  ((norm(fAreas[facei])*norm(Cpf))/(norm(fAreas[facei])*norm(d)*cos(theta) + ROOTVSMALL))*d;

变成(忽略ROOTVSMALL

sv = Cpf - (norm(Cpf)/(norm(d)*cos(theta) + ROOTVSMALL))*d;

是和theta之间的d角度fAreas[facei]让我们重新组织(我再次无视ROOTVSMALL

sv = Cpf - norm(Cpf)/norm(d)*d*(1/(cos(theta) + ROOTVSMALL));

这样就更清楚地知道这是如何衡量偏度的。对于没有退化元素的网格,theta可以取开区间中的值,并取区间中的值。在最后一步,归一化会生成一个单位向量并为您提供每个方向的偏度。0 表示在给定方向上没有偏斜,其他值将表示一些偏斜。我认为将是最偏斜的情况,并且对应于退化的相邻元素。(π/2,π/2)1/cos(theta)[1,)svHat = sv/(mag(sv) + ROOTVSMALL);svHat1

不同的偏度测量

正如 Maxim Umansky 在对问题的评论中提到的那样,有一篇维基百科文章讨论了skewness这些是元素偏度的有效度量,但是,它们没有说明网格的偏度。除了基于等边体积的那个。例如,根据这些措施,菱形域与菱形元素的网格划分将被认为是倾斜的,但是,这不是您想要的。

我熟悉的另一个偏度定义是其中是两个相邻元素之间的面,是面的面积,是面的质心,是连接 Own 元素中心和相邻元素中心的线段的中点。在这种情况下,如果每对相邻元素的因此,这个偏度的定义以为界,但它可以是一个无限大的负数。

1||cd|||F|,
F|F|cFdcd11

此定义与 OpenFOAM 度量之间的差异

  • 我熟悉的那个给你一个标量,OpenFOAM 测量返回一个向量并告诉你偏度的方向
  • OpenFOAM 度量在中(如果我没记错的话),另一个在中。[1,0](,1]
  • 这个泛化到多边形和多面体(这是二手信息,即我前段时间听到的东西),我不确定 OpenFOAM 的。

由于这些原因,即使我相信它们是等价的定义,我也无法证明它们是等价的,例如如何将向量与标量进行比较?但是,两者都将以下两个元素描述为高度倾斜的,因此这是我证明它们等价的证据。 在此处输入图像描述