本周,我们了解一下散度的离散格式指定,如下程序段位于 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;