证明在具有自动步长选择的代码中时间步长足够小

计算科学 收敛 准确性 时间积分
2021-12-02 11:34:50

我最近继承了大量遗留代码,这些代码解决了一个非常僵硬的瞬态问题。我想证明空间和时间步长足够小,如果减小它们,计算解决方案的定性性质不会改变。换句话说,我想表明解决方案在质量上是“收敛的”。由于我可以明确设置空间网格大小,因此该部分很简单。但是,由于代码使用自动时间步长控制,我无法直接设置时间步长。

该算法根据在最后一次达到容错所需的雅可比迭代次数来更改两个边界之间的时间步长n时间步长。它使用雅可比迭代的事实使我相当肯定它是某种隐式方案,但我不能绝对肯定。它没有考虑在当前时间步中看到的错误,这导致它有时会遇到迭代限制(可能在几千个时间步的过程中十几次,几乎总是在最动态的部分模拟)。我正在完成的当前运行我将时间步长界限设置为两个半数量级(101351011)。

在运行中,我可以控制时间步长范围、选择当前时间步长时它查看的过去时间步长的数量、时间步长的最大变化(比率)、雅可比迭代的目标数量、最大迭代次数和误差范围。我想如果有人能让我走上分析时间步独立性的正确道路,或者至少弄清楚使用了什么算法。

1个回答

自动误差估计和步长控制的目的是让您摆脱手动确定足够小的步长的问题。所以你的问题有点像问“有人给了我这辆自动变速箱车;我怎么知道我在哪个档位?” 关键是你不需要知道。当然,如果传输有故障,那么您可能需要将其拆开并修复它,但这是一个更大的问题。

在您的情况下,通常正确的方法是确定可接受的错误类型,并通过自动步长控制强加该错误。它是不完善的,因为这种意义上的错误控制通常只是局部错误控制,所以你不直接控制全局错误,这可能是你关心的。

如果您有疑问,您可以轻松做到的一件事是使用一系列越来越严格(即较小)的误差容限来运行模拟。一旦解决方案似乎对降低容差不敏感(无论您的指标是什么),您就可以停止。

附录:关于达到最大迭代限制(导致局部错误超过指定容差)的问题,我建议如下。

显然代码认为如果超过最大迭代次数,正确的做法是接受该步骤。我会说这是错误的。更好的方法是拒绝该步骤并以减小的步长重新开始该步骤。当然,存在步长减小到最小步长以下的危险。在这种情况下,正确的做法是中止模拟。但是,如果您认为错误的解决方案总比没有解决方案好,那么您可以接受该步骤并在满足两个条件的情况下继续:达到最小步长并且超过最大迭代次数。

在设计良好的代码中,进行这些类型的更改是微不足道的,但在任意代码中可能会非常困难。