可压缩 Navier-Stokes 方程的简单有限体积法

计算科学 算法 有限体积 纳维斯托克斯
2021-12-02 10:13:10

我有兴趣为不稳定、可压缩的 Navier-Stokes 方程(包括冲击)编写一个简单的、以单元为中心的 2D FVM 代码。我的大部分经验是有限差分和有限元方法。不久前,我确实为 Sod 的问题开发了一个有限体积代码作为学习练习。我一直在通过书籍和文献寻找一种简单的算法,我可以将其作为起点来实现,但运气不佳。大多数关于有限体积方法的最新论文都集中在高阶精确方案等。我真的只想要空间中的二阶精度。有谁知道可压缩 Navier-Stokes 方程的算法的良好描述?

我现在想避免 DG,因为冲击捕捉仍然是一个活跃的研究领域。任何见解或想法将不胜感激。

1个回答

有很多方法可以解决可压缩的纳维斯托克斯方程。一种方法是将所有方程(连续性、动量和能量)作为一个耦合方程系统一起求解。如果您的流动是无粘性的,这是一个相当简单的方程组来求解。但是如果你想模拟粘性流,你得到的非线性方程系统将非常大,甚至可能不适合你的机器内存。此外,求解非线性方程组本身也面临一系列挑战。

解决粘性流动的另一种方法是将方程解耦并在每个时间步内的迭代循环中以一次一个的方式求解每个方程。这使您可以在有限的计算机内存限制下更灵活地工作。它还线性化了动量方程中的平流项(以及能量方程中的动能项),因此您无需求解速度或能量的非线性系统。PISO(压力隐式分裂算子)和 SIMPLE(压力关联方程的半隐式方法)都是基于这个原理。虽然 PISO 和 SIMPLE 最初是为求解不可压缩的纳维斯托克斯方程而制定的,但它们也可用于求解可压缩版本。

这两种算法之间的混合有时被称为“PIMPLE”方案(piso 和 simple 的组合)。这种混合算法的工作原理如下:

for each timestep
    for a fixed number of iterations N1
        solve continuity equation (for density)
        solve momentum predictor equation (for velocity)
        solve energy equation (for energy)
        for some fixed number of iterations N2
             solve pressure equation
             update velocity
             update density (using the equation of state)
        end
        solve turbulence equations
    end
end

在任何一个给定步骤,您都使用最近解决的数量。例如,在求解密度的连续性方程后,您使用此密度解求解速度的动量预测方程,然后使用此速度求解能量方程,等等...

你会注意到这个算法既有一个外循环(受 SIMPLE 算法的启发)和一个内循环(受 PISO 算法的启发)。这就是在 OpenFOAM 的rhoPimpleFoam求解器中求解可压缩纳维斯托克斯方程的方式。

准确性取决于您的网格/时间步长大小以及您如何离散每个方程中的运算符。对于时间导数,您可以使用曲柄尼科尔森方案及时获得二阶精度。对拉普拉斯算子(出现在动量预测器、能量和压力方程中)使用中心差分离散化将导致二阶精度。然而,连续性、动量预测器和能量方程都包含一阶散度算子(将它们视为空间中的一阶导数)。散度算子上的中心差是不稳定的。您可以通过为散度算子使用二阶迎风方案来实现二阶精度。根据流动的复杂性(例如冲击波和其他高马赫可压缩流动效应),二阶方案可能不会导致二阶精度和/或甚至可能不稳定。在这种情况下,最安全的做法是使用一阶迎风方案(即使它会降低整体精度,但通常会导致更稳定的时间步进和/或冲击捕获)。