Article

一维水动力模型:有限差分、有限体积及其实现

水动力模型FDMFVM

最近一段时间,我把不少精力放在一维水动力模型上。写这篇文章,主要是想把建模和实现思路整理一下:面对真实河道断面、复杂边界和工程算例时,怎样把一维圣维南方程做成一个稳定、可扩展、可验证的求解器。

一维模型的意义不止于”跑出一条过程线”。往上,它连着河网、水库调度、漫滩分析和一二维耦合;往下,又落到断面数据清洗、水力几何计算、时间推进、守恒误差诊断和性能优化。很多直接影响结果质量的问题,教科书里往往只是带过,真正做起来才发现这些环节能不能彼此咬合才是关键。

一维水动力模型计算结果示意图

一维非恒定流求解结果示意。这张图主要用来说明求解器在不规则断面、边界条件和时间推进上的整体处理。

问题背景

如果场景只是规则矩形河道,一维模型并不难写;一旦进入工程场景,问题很快就会变成下面几类:

后面的很多实现工作,基本都围绕一个目标展开:把断面几何、离散格式、边界条件和求解效率组织成一个可持续演进的一维核心。

如果只保留最核心的物理表达,一维非恒定明渠流问题通常可以写成下面这组圣维南方程:

At+Qx=0\frac{\partial A}{\partial t} + \frac{\partial Q}{\partial x} = 0 Qt+x(Q2A)+gAZx+gASf=0\frac{\partial Q}{\partial t} + \frac{\partial}{\partial x}\left(\frac{Q^2}{A}\right) + gA\frac{\partial Z}{\partial x} + gA S_f = 0

其中 A 是过水面积,Q 是流量,Z 是水位,Sf 是摩阻坡降。到了工程实现阶段,问题很快就会转到另一层:这些量怎样在不规则断面、复杂边界和离散网格上保持一致。

为什么同时做有限差分和有限体积

我一直觉得有限差分法和有限体积法是两条各有侧重的技术路线,关注点不完全一样。

FDM:适合把“稳定的大时间步求解”做扎实

有限差分法这部分,我主要做的是基于 Preissmann 四点隐式格式 的一维非恒定流求解器。它的优点比较明确:

这条线里,费工夫的地方主要在每个时间步都要解一个耦合的非线性方程组。相比把离散式写出来,更费精力的是把它落成一个完整的求解流程:

这部分做下来以后,我对“隐式格式为什么稳”有了更具体的认识。稳定性并不是一个抽象标签,它背后对应的是雅可比、摩阻项、几何导数和边界条件这些环节都要处理得足够一致。

FVM:适合把“守恒、干湿和不连续”做得更可靠

有限体积法这部分,我主要关注它在守恒性和工程扩展性上的优势。对于非恒定明渠流,尤其是在要处理干湿交替、强地形变化,甚至向一二维耦合过渡时,FVM 的框架会更自然。

这里我重点处理的是:

这部分往下做,很快就会碰到另一类问题。黎曼求解器当然重要,但如果断面几何是不规则的,那么界面两侧的水力量如何投影到统一几何上、源项和通量是否共享同一套几何解释、面表和单元表是否一致,这些都会直接影响结果质量。

从更新形式上看,FVM 更接近“按控制体积守恒”去思考问题。单元更新可以概括成:

Uin+1=UinΔtΔx(Fi+12Fi12)+ΔtSiU_i^{n+1} = U_i^n - \frac{\Delta t}{\Delta x}\left(F_{i+\frac{1}{2}} - F_{i-\frac{1}{2}}\right) + \Delta t\, S_i

这里 U 是守恒变量,F 是界面通量,S 是源项。这个结构比较清楚,所以后面在处理地形源项、干湿边界和一二维耦合接口时,我也更愿意把 FVM 作为主干继续往前推。

水力几何这一层很关键

如果只看方程形式,一维模型像是在解 AQZ。但在不规则天然河道里,这几个量背后连着一整套几何关系:

如果每一步都按断面原始点坐标临时现算,性能和稳定性都会很差。所以后面我把不少精力放在预计算 + 向量化查询上:

这看上去像实现细节,但实际上直接决定模型能不能从”原型代码”走到”可长期维护的核心模块”。后面很多数值实验之所以能做得更快、更稳定,很大程度上都依赖这层几何抽象。

两条路线最后怎么汇合

把 FDM 和 FVM 都做过一遍之后,我的理解反而更清楚了:它们表面上是两套离散格式,底下处理的其实是同一类问题——怎样把物理约束、几何约束和数值稳定性统一起来。

我现在更倾向于这样分工:

两条路线对照着做过之后,再看这个问题时,注意力自然不会只停留在”哪种格式更高级”上。更实际的判断标准是问题本身需要什么:是更大的时间步,还是更严格的守恒;是更平滑的过程线,还是更稳健的界面处理。

实现中的几个关键取舍

最近这一轮一维核心迭代里,我主要盯着这些点:

这些点单看都不算新概念,放到同一个求解器里以后,差别就会慢慢出来。

复盘

写到最后,我对这个方向的理解比以前具体了很多。会写圣维南方程只是起点,后面更费工夫的是把方程、断面、边界、守恒和求解效率这些东西接起来,变成一套能稳定运行的方法。

前面做 FDM,让我把隐式求解、线性化和大时间步推进这条线走通了;后面做 FVM,又把守恒、界面通量、干湿处理和后续耦合扩展这条线补齐了。两条路都自己实现过以后,再看一维模型问题时清楚得多——至少能比较快地判断瓶颈到底在几何、在边界、在离散,还是在求解器结构本身。

再往后做,这类积累最终还是会落到数值方法、工程实现和后续扩展这几个层面上。把这几层接起来,一维核心才能继续往前推。

关联原文