二维浅水方程HLL Riemann求解器项目自述文件
项目介绍
本项目实现了一个基于 Harten-Lax-van Leer (HLL) 近似格式的二维浅水方程(Shallow Water Equations, SWE)数值通量求解器。该求解器采用 MATLAB 编写,旨在为有限体积法(FVM)框架提供核心的界面通量计算单元。通过精确估算 Riemann 问题的波速边界,该工具能够稳定地模拟包括溃坝波演进、水跃现象以及复杂地形下的干湿边界变换等水动力学过程。
功能特性
- 高适应性 HLL 格式:核心算法能够自动识别超临界流、次临界流及跨临界流状态,根据波速估算值选取最优的通量计算路径。
- 严谨的干湿边界处理:内置水深阈值判定逻辑,专门针对干河床(Dry Bed)演进进行了优化,有效避免了零水深附近可能出现的数值不稳定和除零错误。
- 坐标旋转不变性:算法通过将物理量投影至界面法线与切线方向,将复杂的二维 Riemann 问题简化为局部一维问题求解,使其能够完美支持正交网格、非结构化三角形网格或任意多边形网格。
- 物理量守恒:采用严格的保守型格式更新,确保在长时段模拟中质量与动量的守恒性。
- 实时动态可视化:主程序集成了动态绘图模块,可直观观测水深分布与流速场的演进过程。
系统要求
- MATLAB R2016b 或更高版本。
- 基本数学工具箱(用于向量化计算与绘图)。
使用方法
- 参数配置:在主程序开头设置物理常数(如重力加速度 $g$)和干湿判定阈值 $eps_h$。
- 初始状态定义:根据算例需求设置计算域长度、单元数量及初始时刻的空间水深和动量分布。
- 时间步长控制:程序内置了基于 CFL 条件的自适应时间步长计算逻辑,用户可通过调整 CFL 数(建议在 0.45 以下)来平衡计算效率与稳定性。
- 运行模拟:直接运行主程序,系统将首先输出单次界面通量的测试结果,随后开启动态数值模拟。
核心实现逻辑说明
主程序及内部函数严格遵循以下逻辑流程:
1. 坐标投影与旋转
为了处理二维空间中的任意走向界面,程序首先获取界面的法向量 $(nx, ny)$。利用旋转矩阵将全局坐标系下的速度分量 $(u, v)$ 投影为界面法向速度 $un$ 和切向速度 $ut$。后续的所有 Riemann 状态解析均在局部坐标系下进行。
2. 波速估算 (Wave Speed Estimation)
波速的准确估算决定了 HLL 格式的数值耗散水平:
- 湿-湿界面:结合左、右两侧的特征速度及基于平均水深的波速,通过取极小/极大值的方式确定波速下界 $SL$ 和上界 $SR$。
- 干-湿界面:对于一侧为干床的特殊情况,采用解析解析关系(如 $SL = unL - cL, SR = unL + 2cL$)来估算波阵面扩散速度。
- 全干界面:若两侧水深均低于阈值,则直接判定通量为零,不执行后续计算。
3. HLL 通量组合
根据估算的波速区间进行分类讨论:
- 左侧超临界 ($SL ge 0$):界面通量完全取决于左侧状态。
- 右侧超临界 ($SR le 0$):界面通量完全取决于右侧状态。
- 星区/次临界 ($SL < 0 < SR$):利用 HLL 经典公式,通过左右侧通量向量与状态向量的线性组合,计算出跨越界面产生的数值通量。
4. 逆旋转与全局映射
将局部坐标系下计算得到的质量通量、法向动量通量和切向动量通量,通过逆旋转操作映射回全局坐标系,得到最终用于更新单元状态的 $fluxH, fluxHU, fluxHV$。
5. 时间演进与后期修正
采用一阶前向 Euler 方案进行保守型变量更新。在每个时间步结束时,程序会执行强制性的干边界后处理,将水深小于阈值的单位及其动量强行归零,以保证物理上的真实性并防止负水深的产生。
关键算法与细节分析
- 自适应时间步长:算法在每一轮迭代前,通过全局搜索最大特征波速(流速与静水波速之和),动态计算满足 CFL 条件的 $dt$,确保了计算过程的震荡抑制。
- 切向动量传输:在二维框架下,HLL 格式不仅处理了法向的质量和动量交换,还通过 $FL_ut$ 和 $FR_ut$ 考虑了切向动量的输运,这是维持复杂流场环流结构的关键。
- 保守变量更新:程序通过维护 $h, hu, hv$ 三个守恒量来描述流动状态,通过通量在单元边界的进出实现物理量的精确演化。