# 非结构化网格的浅水方程模拟实现(python) **Repository Path**: cjqiao/gmsh_SWEs_python ## Basic Information - **Project Name**: 非结构化网格的浅水方程模拟实现(python) - **Description**: 本代码是本人尝试基于非结构网格和有限体积法进行的浅水方程模拟实现,非结构网格由gmsh生成,地形为上下高,中间低的凹弧河道,其运行结果没有做精度验证。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-02 - **Last Updated**: 2025-11-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基本介绍 本代码是本人尝试基于非结构网格和有限体积法进行的浅水方程模拟实现,非结构网格由gmsh生成,地形为上下高,中间低的凹弧河道,其运行结果没有做精度验证。 ![alt text](readme.assets/image.png) 普通cpu线程(test_gmsh_SWEs)运行结果 ![alt text](readme.assets/animation.gif) GPU并行运行(test_gmsh_SWEs_numbaCUDA)运行结果: ![](readme.assets/shallow_water_simulation.gif) # 运行环境 -python3.13+numpy+scipy+matplotlib+gmsh+numba-cuda # 控制方程 ## 1.1 连续性方程(质量守恒) $$\frac{\partial h}{\partial t} + \frac{\partial (hu)}{\partial x} + \frac{\partial (hv)}{\partial y} = 0$$ ## 1.2 动量方程(x方向) $$\frac{\partial (hu)}{\partial t} + \frac{\partial}{\partial x}\left(hu^2 + \frac{1}{2}gh^2\right) + \frac{\partial (huv)}{\partial y} = gh(S_{0x} - S_{fx})$$ ## 1.3 动量方程(y方向) $$\frac{\partial (hv)}{\partial t} + \frac{\partial (huv)}{\partial x} + \frac{\partial}{\partial y}\left(hv^2 + \frac{1}{2}gh^2\right) = gh(S_{0y} - S_{fy})$$ ### 变量定义 | 符号 | 物理意义 | 单位 | | -------- | ------------- | ---- | | $h$ | 水深 | m | | $u$ | x方向流速 | m/s | | $v$ | y方向流速 | m/s | | $g$ | 重力加速度 | m/s² | | $z_b$ | 河床高程 | m | | $S_{0x}$ | x方向底坡 | - | | $S_{0y}$ | y方向底坡 | - | | $S_{fx}$ | x方向摩阻坡降 | - | | $S_{fy}$ | y方向摩阻坡降 | - | ### 宽浅河道近似($R_h \approx h$) $$S_f = \frac{n^2 V |V|}{h^{4/3}}$$ ## 1.4 各方向分量形式 $$S_{fx} = \frac{n^2 u \sqrt{u^2 + v^2}}{h^{4/3}}$$ $$S_{fy} = \frac{n^2 v \sqrt{u^2 + v^2}}{h^{4/3}}$$ ## 1.5底坡项计算 $$S_{0x} = -\frac{\partial z_b}{\partial x}$$ $$S_{0y} = -\frac{\partial z_b}{\partial y}$$ ## 2.1 干湿边界处理 当 $h \rightarrow 0$ 时: - 设置最小水深阈值:$h_{min} = 10^{-6}$ m - 摩阻项归零:$\lim_{h \to 0} S_f = 0$ ## 2.2 稳定性条件 CFL条件: $$\Delta t \leq CFL \cdot \frac{\min(\Delta x, \Delta y)}{\max(|u| + \sqrt{gh})}$$ 其中 $CFL \leq 1$ ### 2.3 数值通量计算 推荐格式: - HLL格式(Harten-Lax-van Leer) - HLLC格式(带接触间断的HLL)(本代码使用) - 通量差分裂格式 # 本人认为模拟运行稳定性的关键 - 干湿边界处理,水深h非负 - HLLC的通量计算 - CFL条件 - 边界条件 - 极端速度的限制(本代码基于Froude数限制)