#201926
本周将讲解差分格式 vanLeer, 在一维均分网格上,其插值的形式为
\phi_e=\phi_P + \frac{1}{2}\varPsi(r)\left( \phi_P - \phi_W \right)
根据 \varPsi(r) 的不同,有不同的插值格式。
然而,当采用非结构化、甚至于多面体的网格时,对于 upstream 或 up-upstream 的网格就可能出现多个,上面的公式就很难应用了。因此,Jasak 等[1] 根据 NVD 构造的原理,对 NVD 于多面体网格时的差分格式作了一定的升级。
vanLeer.H 内有 limiter,它是基于
scalar limiter
(
const scalar,
const scalar faceFlux,
const typename LimiterFunc::phiType& phiP,
const typename LimiterFunc::phiType& phiN,
const typename LimiterFunc::gradPhiType& gradcP,
const typename LimiterFunc::gradPhiType& gradcN,
const vector& d
) const
{
scalar r = LimiterFunc::r
(
faceFlux, phiP, phiN, gradcP, gradcN, d
);
return (r + mag(r))/(1 + mag(r));
}
上面代码中,vanLeer::limiter 返回值为
\frac{r+|r|}{1+|r|}
r 的计算可在 NVDTVD.H 中查到
scalar r
(
const scalar faceFlux,
const scalar phiP,
const scalar phiN,
const vector& gradcP,
const vector& gradcN,
const vector& d
) const
{
scalar gradf = phiN - phiP;
scalar gradcf;
if (faceFlux > 0)
{
gradcf = d & gradcP;
}
else
{
gradcf = d & gradcN;
}
if (mag(gradcf) >= 1000*mag(gradf))
{
return 2*1000*sign(gradcf)*sign(gradf) - 1;
}
else
{
return 2*(gradcf/gradf) - 1;
}
}
用公式列出来就是
r = \left\{
\begin{align}
2\times\frac{d(\nabla\phi)_P}{\phi_N - \phi_P}-1,\quad \text{if}\quad \text{flux}_f>0\\
2\times\frac{d(\nabla\phi)_N}{\phi_N - \phi_P}-1,\quad \text{if}\quad \text{flux}_f\leq 0
\end{align}
\right.
式中, d 表示该面相邻两网格的距离, (\nabla\phi)_P 表示 P 控制网格的 \phi 的梯度。因此, d(\nabla\phi)_P 就表示 P 控制网格的 \phi 的变化量,N 表示该面的另一个相邻网格。
Reference
- Jasak H, Weller H, Gosman A. High resolution NVD differencing scheme for arbitrarily unstructured meshes, International Journal for Numerical Methods in Fluids, 1999, 31 , 431-449
- https://www.openfoam.com/documentation/guides/latest/doc/guide-schemes-divergence-vanleer.html#sec-schemes-divergence-vanleer-nvd
- https://www.openfoam.com/documentation/guides/latest/doc/guide-schemes-divergence-nvd-tvd.html