交错网格上浅水方程中的能量问题

计算科学 Python 一体化 保护
2021-12-06 04:35:29

我认为这是一个关于数值积分器能量守恒的问题。我正在研究 python 中的线性化一维浅水方程 - 供参考,这里它们是:

ut+Uux+ghx=0ht+Uhx+Hux=0

其中是水的速度,是水柱的高度,是平均速度,是平均高度,是重力常数 (9.81 m/s²)。我正在尝试在交错网格上使用中心空间离散化和跨越式时间步长(前向第一步)来求解这些方程。下图显示了非交错和交错网格的示例。uhUHg

网格

集成有效,结果良好。现在,我正在研究系统的能量。我的问题是,这样做是否合理。将“波”的能量定义为是否有意义?对于每个时间步长,我计算了每个位置的动能和势能,并将它们整合到空间域中以获得平均值,以便我可以绘制随时间变化的总能量:E=12u2+ghnumpy.trapz()

总能量

但我真的不明白我在看什么。能量不应该是守恒的吗?越级不是辛积分器吗?或者这在这种情况下没有任何意义?

1个回答

我将假设扰动不足以产生冲击波,这是完全不同的蠕虫罐头。

你的能量泛函很接近但不太正确——浅水方程的哈密顿量是

H=12Ω(h|u|2+gh2)dx,

尽管泊松括号涉及更多。如果您关心问题的哈密顿结构,您也可以正确地将辛积分器确定为使用的工具。但重要的是要注意辛积分器保留了一些扰动哈密顿量的能量

H=H+δtδH+O(δt2),

很多时候,我们可以使用 Baker-Campbell-Hausdorff 公式根据几个泊松括号读出换句话说,一些能量漂移是可以预料的。一些时间方案保证完全保留所有线性和二次不变量,但项不是二次的。也就是说,从修改后的哈密顿量的轨迹中精确采样的特性非常有用——你可以免费获得很多特性,比如接近平衡的系统结构、有界轨道、相空间体积守恒等。δHh|u|2H

我还没有具体研究过浅水方程的辛离散化的细节,所以对此持保留态度。有几个显式方案仅对简单的哈密顿量是辛的,可以用通常的泊松括号SWE 的哈密顿量和括号都不是。我认为隐含的中点规则H=K(p)+U(q)

zn+1znδt=f(zn+1+zn2)

对于 ODE即使在不寻常的情况下也是辛的。现在你有一个隐式方程要求解,但没有什么是免费的。因此,可能值得尝试其他时间步长方案。z˙=f(z)

最后,逆风与问题的哈密顿结构以一种有点微妙的方式相互作用。尽管他们采用了更多的有限元方法,但本文研究了如何使用逆风对 SWE 进行能量守恒离散化。

根据您显示的图,您应该问自己,您发现的能量漂移是否表明错误或未能保持哈密顿结构,或者仅仅是积分轻微扰动问题的预期漂移。虽然您写下的哈密顿量并不完全正确,但您显示的图表明能量漂移约为 0.035,总共约为 10,因此漂移不到总数的 1%。这对我来说并没有引起任何危险,但如果你想尝试一些事情来调试它,你可以:

  1. ,下再次运行模拟,看看能量漂移是什么样的。任何收敛的时间步长方案(辛或非辛)都应该将漂移减半,所以这不会告诉你你需要知道的一切。δx/2δt/2
  2. 运行模拟很长时间,看看能量漂移是什么样子的。要了解“长”的含义,您可以从波速中获得速度标度,并从域的直径的几个倍数是一个不错的选择. 如果解决方案爆炸,您的方案可能不是辛的。c=ghLL/c

如果您遇到的问题与捕获冲击波有关,我会同意评论中的建议,即仅使用有限体积方法,但情况似乎并非如此。