Code of the Week #39: div(phi,U) Gauss vanLeer

#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

  1. 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
  2. https://www.openfoam.com/documentation/guides/latest/doc/guide-schemes-divergence-vanleer.html#sec-schemes-divergence-vanleer-nvd
  3. https://www.openfoam.com/documentation/guides/latest/doc/guide-schemes-divergence-nvd-tvd.html