如何在精确的时间步输出粒子信息到VTP文件

tests/提供的案例(如二维溃坝)中,尽管用户明确指定了每隔0.1秒输出一次粒子信息到VTP文件,可是得到的VTP文件的物理时间仍然不是0.1的倍数。

这是因为SPHinXsys模拟时采用可变时间步长。判断是否要输出到文件时,只需要满足物理时间超过output_interval即可,并没有要求物理时间恰好等于output_interval

为了在精确的0.1, 0.2, 0.3, …秒输出,我们需要限制一下时间步长。

双标准时间步推进一般采用下列程序:

一旦integration_time >= output_interval,就会输出。而这个integration_time的累加是由acoustic_dt推进的。所以我们只要控制好acoustic_dt就能够让某个时间点恰有integration_time == output_interval。因此,我们要盯着当前的integration_time距离output_interval还有多远。假如下一个acoustic_dt会使得integration_time > output_interval,就说明acoustic_dt迈大了,要把步子收一收。也就是说

如此可以保证integration_time会精确落在output_interval的位置。

但是这还没完。如果最后一个步子迈小了,很有可能导致在relaxation_time < advection_dt时,便已经满足了integration_time == output_interval。此时已经无法再向前推进,于是内层循环永远无法退出:

为了解决这个问题,我们需要在内层循环的判断条件再加一条:只有当integration_time < output_interval时,才能进入内层while循环。一旦integration_time达到output_interval,便退出内层循环。

完整的修改如下:

经过这次修改,VTP文件可以在0.1, 0.2, 0.3, …秒输出了:

Last updated