外观
线性浅水离散格式的能量守恒条件
线性浅水方程的能量守恒不能只看空间离散,也不能只看时间格式。一个数值格式要真正保持能量,至少要同时满足两层结构:
- 空间离散中,离散梯度和离散散度互为负伴随;
- 时间推进中,更新格式能保持反对称线性系统的二次能量。
这篇文章统一说明连续系统、半离散矩阵、Crank--Nicolson、forward Euler,以及 overlap 权重里的常见陷阱。
连续系统里的能量守恒
考虑闭曲面上的线性旋转浅水系统
∂tu+fu⊥+g∇h=0,
∂th+H∇⋅u=0.
这里 u 是速度,h 是自由面高度扰动,H 是平均流体深度。物理能量定义为
E(t)=21∫Ω(H∣u∣2+gh2)dx.
对时间求导并代入方程:
dtdE=H(∂tu,u)+g(∂th,h).
再利用
∂tu=−fu⊥−g∇h,∂th=−H∇⋅u,
得到
dtdE=−H(fu⊥,u)−gH(∇h,u)−gH(h,∇⋅u).
其中
(u⊥,u)=0,
而在没有边界通量时,
(∇h,u)=−(h,∇⋅u).
两项抵消,所以
dtdE=0.
因此连续能量守恒的核心有两点:
- Coriolis 项对应反对称结构;
- 梯度和散度在 L2 内积下互为负伴随。
半离散系统的空间条件
空间离散后,方程通常写成
Mudtdu=−Ru−gGh,
Mhdtdh=−HDu.
其中 Mu 和 Mh 是速度、高度空间的质量矩阵,R 是 Coriolis 项对应的反对称块,G 是高度到速度方程的离散梯度耦合,D 是速度到高度方程的离散散度耦合。
离散能量定义为
Eh=21HuTMuu+21ghTMhh.
对时间求导并代入半离散方程:
dtdEh=−HuTRu−gHuTGh−gHhTDu.
由于反对称矩阵满足
uTRu=0,
并且
hTDu=uTDTh,
所以
dtdEh=−gHuT(G+DT)h.
要让任意 u,h 下都没有能量产生或耗散,必须有
RT=−R,G+DT=0,
也就是
D=−GT.
这就是空间离散层面的能量守恒条件。它对应连续层面的分部积分公式
(∇h,u)=−(h,∇⋅u).
为什么 DG 高度空间下梯度形式和散度弱形式不等价
在 H(div) 速度空间和 DG 高度空间中,使用散度弱形式
(∂tu,v)+(fu⊥,v)−g(h,∇⋅v)=0
通常更自然,因为它直接把离散负伴随关系写进耦合结构。
连续层面上,
(∇h,v)=−(h,∇⋅v)
在没有外边界通量时成立,所以
∂tu+g∇h=0
既可以写成
(∂tu,v)+g(∇h,v)=0,
也可以写成
(∂tu,v)−g(h,∇⋅v)=0.
但这个等价隐含了一个前提:h 是全局足够光滑的连续函数,∇h 是普通意义下的全局梯度。对 DG 高度空间,这个前提不成立。
在常见的兼容有限元离散里,
uh∈H(div),hh∈DG.
H(div) 速度的法向通量在单元面上连续,但 DG 高度允许在单元面上跳跃。因此 hh 的分布意义梯度不是单纯的逐单元梯度,而是
∇hh=∇hhh+internal face jump terms.
如果只计算
K∑∫Kvh⋅∇hhhdx,
就把内部面上的跳跃贡献丢掉了。
逐单元分部积分给出
∫Kvh⋅∇hhdx=−∫Khh∇⋅vhdx+∫∂Khhvh⋅nKds.
把所有单元求和后,闭合曲面只能消去外边界项,内部面项仍然保留。设内部面 F 两侧高度为 h+ 和 h−,由于 vh⋅n 连续,内部面贡献可写成
F∑∫F(vh⋅n)[hh]ds.
DG 高度一般满足 [hh]=0,因此这个项不会自动消失。于是
K∑∫Kvh⋅∇hhhdx=−K∑∫Khh∇⋅vhdx.
这说明在 H(div)-DG 配对里,逐单元梯度和散度弱形式不是同一个离散算子。
从矩阵角度看,若定义散度耦合
Cij=∫Ω(∇⋅vi)hjdx,
那么使用散度弱形式时,速度方程里的高度块和高度方程里的速度块天然满足负转置关系
G=−C,D=CT,G=−DT.
这正是能量守恒所需的反伴随结构。
但如果把速度方程的高度耦合改成逐单元梯度
Gij=∫Ωvi⋅∇hhjdx,
而高度方程仍然使用
Cij=∫Ω(∇⋅vi)hjdx,
则由于缺少内部面跳跃项,一般有
G=−C.
于是负伴随结构被破坏,CN 也就不再能自动保持离散二次能量。
更重要的是,这不只是“少了一点高阶修正”。对 DG 高度来说,原方程中的梯度项本来就应当包含界面跳跃贡献。若只保留逐单元梯度,相当于改写了离散波传播算子本身,因此误差可能很快放大到 O(1)。常见现象是质量约束仍然看起来稳定,但能量明显漂移,整体误差快速增长。
CN 格式为什么能守恒
空间条件只说明半离散连续时间系统守恒。时间离散以后,还要看一步更新是否继承这个结构。
设半离散系统写成
Mudtdu+Ru+gGh=0,
Mhdtdh+HDu=0.
Crank--Nicolson 格式为
Mu(un+1−un)+Δt(Run+1/2+gGhn+1/2)=0,
Mh(hn+1−hn)+ΔtHDun+1/2=0,
其中
un+1/2=2un+1+un,hn+1/2=2hn+1+hn.
第一式左乘 H(un+1/2)T,第二式左乘 g(hn+1/2)T。利用质量矩阵对称性,两式相加得到
En+1−En=−ΔtH(un+1/2)TRun+1/2−ΔtgH(un+1/2)T(G+DT)hn+1/2.
若空间离散满足
RT=−R,D=−GT,
则
En+1=En.
所以 CN 的作用是把能量差精确写成时间中点处的耦合项;空间反伴随结构再让这个耦合项精确抵消。
为什么 forward Euler 不守恒
即使空间离散满足反伴随关系,forward Euler 也通常不保能量。
把半离散系统抽象成
yt=Ay.
若 AT=−A,连续系统保持二次能量。但 forward Euler 给出
yn+1=(I+ΔtA)yn.
于是
∥yn+1∥2=(yn)T(I+ΔtA)T(I+ΔtA)yn.
利用 AT=−A,
(I+ΔtA)T(I+ΔtA)=(I−ΔtA)(I+ΔtA)=I−Δt2A2.
对反对称矩阵,−A2 通常是半正定的,因此
∥yn+1∥2=∥yn∥2+Δt2∥Ayn∥2.
除非 Ayn=0,否则每一步都会增加能量。空间反伴随只能保证半离散系统守恒,不能让 forward Euler 继承守恒律。
其他保能量时间格式
CN 不是唯一选择。对线性反对称系统,隐式中点格式和 CN 等价,因此同样严格保持二次能量。CN 也可以看成反对称算子的 Cayley 变换;这个更新在能量内积下是正交的。
Leapfrog 或 Störmer--Verlet 常用于波动方程和 Hamiltonian 系统。它们通常不逐步精确保原始能量,但能保持 modified energy,或者让原始能量长期有界振荡。对非线性 Hamiltonian 系统,Average Vector Field 和 Discrete Gradient 方法则通过离散链式法则直接保持 Hamiltonian。
加权 overlap 积分里的陷阱
在重叠网格或 patch 方法中,积分可能带权:
(a,b)w=∫Ωwabdx.
此时能量写成
Ew=21∫Ωw(H∣u∣2+gh2)dx.
如果 w 不是处处常数,直接使用未加权的分部积分关系会漏项。严格分部积分时,
∫Ωwh∇⋅vdx
并不等价于
−∫Ωw∇h⋅vdx.
还会出现与 ∇w 或权重跳变界面有关的贡献。若这些项没有被加入,离散梯度和散度就不再互为负伴随,能量结构也会被破坏。
质量守恒和能量守恒的区别
质量守恒主要来自连续性方程:
∂th+H∇⋅u=0.
积分后,在闭区域上总通量为零,所以
dtd∫Ωhdx=0.
能量守恒更严格。它要求速度方程和高度方程之间的耦合项成对抵消。所以一个格式可能质量守恒很好,但能量仍然漂移。这通常说明整体通量结构还在,但梯度--散度的离散配对或时间推进没有保持反对称结构。
小结
线性浅水能量守恒可以概括为三层:
- 连续层面:Coriolis 项反对称,∇ 和 ∇⋅ 通过分部积分互为负伴随;
- 空间离散层面:Coriolis 块满足 RT=−R,耦合矩阵满足 D=−GT;
- 时间离散层面:CN、隐式中点等格式能继承二次能量守恒,forward Euler 一般不能。
因此,做线性浅水能量测试时,不能只说“用了 CN”,也不能只说“空间算子反对称”。必须同时检查空间耦合块和时间推进格式。
版权所有
版权归属:Guisong Wu