Error message

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls in menu_set_active_trail() (line 2405 of /home/www/rheoworks/includes/menu.inc).

Code of the Week #5: div(phi,U) Gauss linear

本周,我们了解一下散度的离散格式指定,如下程序段位于 system/fvSchemes 内。

divSchemes 
{ 
    default         none; 
    div(phi,U)      Gauss linear; 
} 

这一对 {} 指定 $\nabla\cdot$ 的离散方法,其中,default none; 指的是无缺省的离散格式;div(phi, U) Gauss linear; 指定了 $\nabla\cdot(\rho U U)$ 的离散格式为Gauss 方法,并使用中心差分。

Gauss 方法是散度的唯一离散方法,并在其后需要指定所求场的插值格式。指定的方法为

div()           Gauss <插值格式>;

插值格式有如下一些选择:

插值格式 简要说明
中心差分
linear 线性插值 (中心差分)
cubicCorrection 三次格式
midPoint 对称权重的中心差分
迎风差分
upwind 迎风差分
linearUpwind 线性迎风差分
skewLinear 有 skewness 的线性迎风差分
filteredLinear2 Linear with filtering for high-frequency ringing
TVD 格式
limitedLinear limited linear differencing
vanLeer van Leer limiter
MUSCL MUSCL limiter
limitedCubic Cubic limiter
NVD 格式
SFCD Self-filtered central differencing
Gamma $\psi$ Gamma differencing

以上的差分格式可以分为三类,一类是通用的(中心差分),第二类是对流项特定的(后三项:upwind, TVD, NVD)。如果要指定 div(phi,U) 为迎风格式,可以写为:

div(phi,U)           Gauss upwind;
格式 数值分析
linear 二阶,无界
skewLinear 二阶, (更) 无界, skewness 修正
cubicCorrected 四阶, 无界
upwind 一阶, 有界
linearUpwind 一/二阶, 有界
QUICK 一/二阶, 有界
TVD schemes 一/二阶, 有界
SFCD 二阶, 有界
NVD schemes 一/二阶, 有界

对流项的差分格式并不需要指定通量的插值格式,因为通量 (phi) 的插值格式已由

interpolationSchemes
{
    default         linear;
}

指定。 interpolationSchemes 子字典主要包括从体心到面心的插值项。这些格式的指定需要列出基于某一通量进行插值的这个通量名称。在 OpenFOAM 应用中,大多数情况为 phi, 是面标量场 (surfaceScalarField) 速度通量 $\phi$ . 三个特定对流项的插值格式有三种:一般的;normalised variable (NV); and, total variation diminishing (TVD). 除了 blended 格式,一般对流和 TVD 格式由差分方法和通量的名称来指定,如:基于通量 phi 的迎风差分定义为缺省格式:

interpolationSchemes
{
    default upwind phi;
}

某些 TVD/NVD 格式需要指定系数 $0\leqslant \psi \leqslant 1 $ ,当 $\psi = 1$ 表示TVD 式,可实现较强的收敛性。 当 $\psi = 0$ 表示实现最好的准确性。推荐设定 $\psi = 1$ 。格式基于 phi 的 limitedLinear 格式且设定 $\psi = 1$ 为缺省插值格式:

interpolationSchemes
{
    default limitedLinear phi 1.0;
}

某些标量场需要严格限制有界,OpenFOAM 也提供了限制器。要指定某一标量的上下界,插值格式的前面要加上 limited 并在其后指定上下界。如,指定 vanLeer 格式严格在 $[-2,\,3]$ 有界,方式为:

interpolationSchemes
{
    default limitedVanLeer -2.0 3.0;
}

还有一些标量通常在 $[0,\,1]$ 有界,也有特殊版本。只需要在插值格式的后面加上 01 (注意没有空格)。如指定 vanLeer 格式,并于 $[0,\,1]$ 有界:

interpolationSchemes
{
    default vanLeer01;
}

OpenFOAM 提供了这几个严格有界的格式:limitedLinear, vanLeer, Gamma, limitedCubic, MUSCL 和 SuperBee。

针对向量场,还可以使用一些增强型的限制器格式,它们将场的方向也考虑进来了。 这些格式后面都加上了 V,如 limitedLinearV 表示增强型的 limitedLinear。这些格式提供 ‘V’ 版:limitedLinearV, vanLeerV, GammaV, limitedCubicV 和 SFCDV。

讨论请移步至CFDwired Forum: Code of the Week #5: div(phi,U) Gauss linear