流体动力学的双时间步长

计算科学 流体动力学 时间积分 预处理
2021-12-17 18:48:12

我正在尝试在现有的有限体积代码中实现Weiss 和 Smith 预处理器,并且我正在为双时间步进的想法而苦苦挣扎。我的内部时间步长是预测校正器,具有本地时间步长加速的二阶显式。时间步长基于基于对流速度的稳定 CFL 数,因为它使用的是预处理值。

我的外部时间步长是二阶后向差分隐式方法。这完全来自 Weiss 和 Smith 1995 AIAA 论文。外部时间步长是自由选择的,以解决所需的任何感兴趣的特征。在伪时间上执行内部时间步长直到收敛,理论上当伪时间行进到无穷大时。发生这种情况时,解决方案应该是用于外部方案的物理时间步长。

我有两个相关的问题。现在在我的代码中,流程演变为由迭代次数乘以内部时间步长确定的时间,而不是简单地成为我的外部时间步长。例如,如果我以 1 m/s 的速度运行涡旋对流情况,外部时间步长为 1 s,内部时间步长为 0.001 s,我希望涡旋在每个外部时间步长移动 1 米。然而,它实际上对流0.001*<number of inner steps>米。

所以我觉得我在整个概念中遗漏了一些东西。我的内部步如何收敛到每个外部时间步 1 秒的物理时间,而不是内部步数乘以内部时间步的物理时间?

1个回答

我相信您正在转换“内部”和“外部”步进的定义(这种命名法在您至少有 3 个单独的迭代方案正在进行的隔离方案中变得更糟。)

您缺少的核心是“伪时间”根本不是时间。这只是实现迭代解决方案的一种便捷方式。在时间方程中取一阶反向差分(空间离散化无关紧要,除了我们在时间 n+1 对其进行评估):

ut+f(u)un+1unΔt+f(u)n+1R(u)=0

现在该表达式是一个隐式方程,您通常需要某种迭代方法来解决它的时间n+1. 在这里,您可以使用任何(非)线性代数求解器来查找u这样R(u)=0. 另一种方法是将该问题视为不稳定的dudτ=R(u)并向前迈进,直到剩余R为 0(我认为这等同于使用 Jacobi 迭代来求解 R(u)=0)。您可能已经将其视为求解拉普拉斯椭圆方程的第一种方法2u=0把它当作一个抛物线方程dudt=2u并逐步收敛。

我们可以将该表达式修改为:

R(u)=uunΔt+f(u)

和写:

uuΔτ+R(u)=0

在哪里u是某个伪时间的值,并且Δτ是伪时间步长。这等于上面的任何时候u=u这意味着u=un+1. 我们可以在伪时间明确地向前迈进。双时间步长的下标/上标总是会变得有点模糊 - 请参阅“使用气动弹性应用程序进行的多网格非定常 Navier-Stokes 计算”例如二阶。

在实现中,一旦你了解了双时间步的工作原理,它就真的很容易了。它在算法上等同于您最初的显式时间步长方案,除了现在您有一个表示隐式不稳定项的附加源项,并且对于每个时间步长,您迭代直到残差接近零。另一种看待这个问题的方法是认识到每个物理非稳态时间步长都相当于解决一个“稳态”问题。