有限体积法中的通量符号和面法线混淆

计算科学 有限体积 离散化 网格生成 开放式泡沫 传播热量
2021-12-09 16:37:56

我实现了二维稳态热方程的求解器(没有热量产生和均质材料),使用有限体积法,但是,我对通量方向和面法线有些困惑。.(kT)=0

首先,使用散度定理(应用于网格元素):

V.(kT) dV=S(kT.n) dS=0

其中垂直于的向外指向单位向量。并且该方程可以进一步离散化为(使用具有单个积分点的高斯求积):nS

faces (T.n)Sf=0

我的 Python 求解器导入一个简单的笛卡尔 (100 x 100 x 1) OpenFOAM 网格(边界、点、面、所有者和邻居),将离散方程应用于每个单元并生成稀疏系数矩阵使得AAT=b

最初,我得到了错误的结果,因为我发现我正在执行以下操作:

每个内部单元格有四个相邻的单元格(:北,:南,:东,:西)cnsew

  1. 通过假设和任意相邻细胞 )之间线性变化时: TxTci
    Tx=TcTidci

第一个错误:我对所有相邻的单元格都使用了这个公式,这对于东面和北面的单元格都是正确的,但是在评估西面和南面时,它应该是TiTc

第一个问题:我认为减法的顺序无关紧要,因为它会被通量方向校正(下一个问题)。那么为什么减法的顺序很重要呢?

  1. 导入所有者-邻居 OpenFOAM 网格关系后,我假设通量始终是从所有者到邻居的方向,因此基本上指向单元外,而对于相邻面,n 基本上是指向内部。n

第二个错误:这也导致了错误的系数矩阵,当我纠正为始终指向单元面外时,一切正常。n

第二个问题: 我应该总是让面法线指向元素之外吗?如果,那么假设通量总是离开细胞,这在物理上是正确的吗?(以及为什么首先要有业主邻居关系)。

抱歉,这个问题很长,但我认为通过提供我的完整方法,我的困惑对读者来说会很清楚。

3个回答

在处理像您的情况这样的守恒定律时,您通常可以利用散度定理(就像您所做的那样)。然后,您可以表示积分区域内的总质量由以下表面积分保留:

ΩkTn S=0

现在,就目前而言,指向哪个方向无关紧要,只要它在这个表面积分上是一致的。n

当您采用的方向向外指向的约定时,您说被传输出去的总质量为零。当您说法线指向内部时,您可以将通量整合到单元中,可以这么说。语句是等价的。当您有源术语时,必须采取适当的措施使符号保持一致。n

在更数学的语言中,您可能有两种完全正确的高斯定理公式,一种具有向内指向的法线,另一种具有向外指向的法线:

规范的,向外指向的高斯定理:

VdivFd(n)V=SFnoutd(n1)S

非规范的,向内指向的高斯定理: \ int_V

VdivFd(n)V=SFnind(n1)S

这些陈述当然是等价的。在第二种情况下,您只需在 rhs 上有一个标志

我不想增加混乱。共识是,对于任何给定的控制体积始终具有指向外的法线,并且许多守恒定律都是以这种方式编写的,但是它有一个约定的元素。如果您在代码中始终使用此约定,则流出一个单元格(负号)的质量将添加到相邻单元格。

法线方向取决于您正在为其编写方程式的单元格。向外这个词是相对于正在研究的单元格的。为了写出每个单元格的方程,即ΣT.nSf=0,坚持这一点:Tface=TcTircri并假设n作为该面的向外指向法向量。我认为您的问题是您在代码的某些地方错误地引入了两个负号;分母中的一个TcTircri一个在法线向量中n. OpenFOAM 将细胞分类为所有者和邻居,以确定向外的方向。

一个扩展的答案。

对于更任意的网格,您必须考虑通常 CFD/FEM 求解器依赖于具有元素和侧列表的通用数据结构:

元素列表

边单

考虑以下图片,这是简单笛卡尔网格的标准情况由于每个面上都有一个加号和一个减号边,因此定义是唯一的,计算不会引起任何问题。用你的话来说,这意味着

  • 东边总是匹配西边
  • 南边总是匹配北边

然而,由于性能原因和并行化策略,面处的通量和导数通常不是按元素计算的。幼稚的实现会导致不必要的双重计算。通过加减的简单定义不再是唯一的。

对于通用数据结构,您必须考虑两件事:

  1. 元素可以在彼此之间旋转
  2. 元素可能有不同的方向

这具有两个相同的边将相互匹配的结果。因此,有必要定义一个额外的映射来获得一个唯一的侧列表,这里定义为主侧和从侧此外,由于方向错误,切向量可能指向不同的方向。这对于高阶元素可能变得很重要。以下图片包含在彼此之间旋转的元素。这里每个主端匹配一个从端