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 插值格式

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,\,4] 有界,方式为:

interpolationSchemes
{
    default limitedVanLeer -2.0 4.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。

以下提供一些离散格式的写法:

    div(phi,U)      Gauss limitedLinear <coeff>; // <coeff> in [0, 1]
    div(phi,U)      Gauss linear;
    div(phi,U)      Gauss linearUpwind grad(U);
    div(phi,U)      Gauss midPoint;
    div(phi,U)      Gauss Minmod;
    div(phi,U)      Gauss MUSCL;
    div(phi,U)      Gauss QUICK;
    div(phi,U)      Gauss UMIST;
    div(phi,U)      Gauss upwind;
    div(phi,U)      Gauss vanLeer;
    div(phi,U)      Gauss CoBlended <co1> <scheme1> <co2> <scheme2>; //Co < co1 : scheme1;
                                        //Co > co2 : scheme2; 
                                        //co1 < Co < co2 : linear blend between <scheme1> and <scheme2>
    div(phi,U)      Gauss DEShybrid
        linear                        // scheme 1
        linearUpwind grad(U)          // scheme 2
        0.65                          // DES coefficient, typically = 0.65
        30                            // Reference velocity scale
        2                             // Reference length scale
        0                             // Minimum sigma limit (0-1)
        1                             // Maximum sigma limit (0-1)
        1e-3;                         // Limiter of B function, typically 1e-03
    div(phi,U)      Gauss filteredLinear2 <k> <l>; 
                                        // k: Scales the rate at which the correction is applied
                                        //    0 : linear
                                        //    1 : fully limited
                                        // l: Maximum allowed overshoot/undershoot relative to the difference across the face.
                                        //    0 : no overshoot/undershoot
                                        //    1 : overshoot/undershoot equal to the difference across the face
    div(phi,U)      Gauss LUST;