☰
SWASH潜堤波浪浅化算例:输入文件配置与运行全流程
2026/10/15 12:05:17 网站建设 项目流程

简介:这份资源是SWASH模型「Shoaling wave over submerged bar」算例的完整输入文件包,面向海岸工程、海洋工程与环境科学领域的学习者和研究人员,用于复现波浪在水下沙洲(潜堤)上的爬升与变形过程。SWASH基于有限体积方法,结合欧拉方程与动边界条件,可模拟自由表面追踪、波浪破碎及流体-固体相互作用等非线性水波动力学问题,该算例正是理解近岸波高变化、反射与绕射的经典入口。压缩包共5个文件,约37KB,包含sws主输入文件、bot地形文件、loc定位文件、m绘图脚本及png结果预览图,覆盖计算域几何、初始与边界条件、时间步进参数等关键设置,便于直接运行与后处理分析。目前已有380人学习下载,适合希望掌握SWASH建模流程、研究沙洲对波浪传播影响及海岸防护设计的读者参考。

1. 潜堤上波浪浅化算例:一份能直接跑起来的 SWASH 输入文件

手里这份资源是 SWASH 模型里一个经典验证算例的完整输入文件——潜堤(submerged bar)上的波浪浅化(shoaling wave)过程。如果你正在做近岸波浪传播、破碎带变形或者潜堤消浪效果的数值模拟,这个算例基本是绕不开的起点。它模拟的是规则波从深水区向岸传播,经过一个淹没在水下的梯形潜堤时,波面发生浅化变形、高次谐波生成、波峰前倾乃至破碎的完整过程。这个算例之所以被反复引用,是因为它有实测数据可对照,能直接检验你的模型参数设置对不对。适合刚接触 SWASH 的新手拿来跑通第一个算例,也适合熟手拿它做网格收敛性和物理参数敏感性测试。资源本身是输入文件集合,不是可执行程序,你需要自己装好 SWASH 才能跑。

2. 潜堤算例的物理背景与文件结构拆解

2.1 为什么选潜堤浅化作为验证算例

潜堤上的波浪浅化是近岸动力学里一个被研究得很透的问题。波浪从外海向岸传播,水深逐渐变浅,波速降低、波长缩短、波高先略微减小然后急剧增大,这是浅化的基本表现。当波浪翻越潜堤顶部时,由于水深突变,波浪发生剧烈变形,能量在频域上从主频向高频转移,生成高次谐波。如果潜堤顶部水深足够浅,波浪还会在堤顶附近破碎,产生强烈的能量耗散。

这个算例的实测数据来自经典的波浪水槽实验,规则波从一端造出,经过潜堤后波面变形被记录下来。SWASH 作为基于非线性浅水方程和 Boussinesq 类方程的模型,能不能复现这些过程,直接反映了模型对非线性项和频散项的刻画能力。我一般建议新手先跑这个算例,因为它物理过程清晰、边界条件简单、计算量不大,跑完能直观看到波面变形,比一上来就搞三维复杂地形要友好得多。

从选型角度看,SWASH 相比其他近岸模型(比如 FUNWAVE、COULWAVE)的优势在于它用的是有限差分格式,对非结构网格支持好,而且输入文件格式相对简洁。这个潜堤算例的输入文件通常包含几个核心部分:主控文件(.sws)、地形文件(.bot 或 .dep)、边界条件文件(.bnd)、物理参数文件(.par)以及可能的观测点文件(.obs)。不同版本的文件命名可能略有差异,但核心逻辑一致。

2.2 输入文件的组成与各文件职责

拿到资源后,先别急着跑,把文件结构看清楚。一个典型的潜堤算例输入文件集合包含以下内容:

文件类型常见扩展名核心作用是否必须
主控文件.sws定义计算模式、时间步、输出选项必须
地形文件.bot / .dep给出计算域内水深或底高程分布必须
边界文件.bnd指定开边界处的波浪条件必须
物理参数文件.par设置水深、重力加速度、摩擦系数等视版本而定
观测点文件.obs指定输出波面的位置建议有
网格文件.grd定义计算网格坐标部分版本需要

主控文件是整个算例的入口,SWASH 运行时读的就是它。里面用关键字加参数的方式定义一切,比如MODE指定是二维还是三维,CGRID定义计算域范围,VERT定义垂向分层,TIME控制时间步长和总时长,BOUNDARY指定边界条件类型,PRINT控制输出格式和频率。

地形文件一般是两列或三列数据:x 坐标和对应的底高程(或水深)。潜堤的形状就靠这个文件刻画——平底段、斜坡段、堤顶段、再斜坡段、平底段。边界文件里通常用BOUNDARY关键字配合SPEC或BOUSS指定波浪类型,规则波的话用正弦波参数(波高、周期、相位)描述。

注意:不同版本的 SWASH 对文件格式要求有细微差别,尤其是地形文件里到底是给水深还是给底高程,搞反了波面会完全不对。跑之前先确认版本和文件约定。

2.3 关键参数初识:波高、周期、水深与潜堤几何

这个算例的核心参数就那么几个,但每一个都直接影响结果。波高 H 决定非线性强度,周期 T 决定频散特性,水深 h 决定浅化程度,潜堤顶部的淹没深度 d 决定波浪是翻越还是破碎。

以经典设置为例:入射波高通常在 0.02 到 0.05 米量级(实验室尺度),周期 1.5 到 2.5 秒,深水区水深 0.4 米左右,潜堤顶部水深 0.05 到 0.1 米。潜堤的坡度一般取 1:2 或 1:4,堤顶宽度约 0.2 到 0.5 米。这些数字看起来不起眼,但组合起来决定了波浪能不能在堤顶破碎。

我见过不少人直接把文献里的参数抄过来,结果跑出来波面乱七八糟。问题往往出在单位不统一——有的文献用厘米,有的用米,SWASH 默认是国际单位制。还有一个坑是波高定义:规则波的波高到底是峰谷差还是振幅的两倍,不同文献写法不同,输入文件里要按 SWASH 的约定来。

3. 从零跑通算例:编译、配置与运行全流程

3.1 环境准备与 SWASH 编译

SWASH 是开源代码,源码可以从官方渠道获取。编译之前需要确认系统里有 Fortran 编译器(gfortran 或 ifort)和 MPI 库(如果要并行跑)。单机跑这个小算例,串行版本就够了。

编译流程大致如下:

# 解压源码包 tar -xzf swash_source.tar.gz cd swash_source # 查看可用的编译配置 ls ./configure* # 以 gfortran 串行版本为例 ./configure FC=gfortran # 编译 make clean make # 编译完成后可执行文件通常在 src 目录下 ls src/swash.exe

编译过程中最常见的报错是找不到 netCDF 库。SWASH 默认支持 netCDF 格式输出,如果系统里没装,要么装一个,要么在 configure 时关掉 netCDF 支持。另一个常见问题是 Fortran 编译器版本太新或太旧,导致某些语法不兼容。我一般用 gfortran 9 以上的版本,基本没出过问题。

编译成功后,把可执行文件路径加到环境变量里,或者直接复制到算例目录下。算例目录里应该包含前面说的那些输入文件。

3.2 主控文件逐行解读与修改

主控文件是核心,我拿一个典型结构来拆:

# 计算模式:非稳态,二维垂向 MODE NONSTATIONARY TWOD # 计算域:x 方向从 0 到 15 米,y 方向 0 到 0.5 米 CGRID 0. 0. 0. 15. 0.5 0. 50 1 # 垂向分层:1 层(深度平均) VERT 1 # 时间步:总时长 20 秒,时间步长 0.001 秒 TIME 0. 20. 0.001 # 物理参数:重力加速度 9.81,水的密度 1000 PHYS 9.81 1000. # 底摩擦:曼宁系数 0.019 FRICTION 0.019 # 边界条件:左侧为规则波入射,右侧为吸收边界 BOUNDARY SEGMENT 1 CONSTANT 0.02 2.0 0. BOUNDARY SEGMENT 2 RIEMANN # 输出设置:每 0.05 秒输出一次波面 PRINT 0.05

逐行看:MODE决定模型是稳态还是非稳态,二维还是三维。潜堤算例必须用非稳态,因为要看波浪传播过程。CGRID定义计算域范围,后面几个数字分别是 x 起点、y 起点、x 终点、y 终点、底高程参考值,最后两个是网格数。VERT设 1 表示深度平均,对于这个算例够用了,如果想看垂向流速结构可以设更多层。

TIME三个参数分别是起始时间、结束时间、时间步长。时间步长受 CFL 条件限制,一般取 0.001 到 0.005 秒。步长太大会发散,太小浪费时间。PHYS设重力加速度和密度,一般不用改。FRICTION设底摩擦系数,实验室水槽通常用曼宁系数 0.01 到 0.02。

边界条件是关键。左侧入射边界用CONSTANT指定波高和周期,右侧用RIEMANN做吸收边界,防止反射波干扰。如果右侧不设吸收,反射波会往回传,和入射波叠加,结果完全没法看。

提示:BOUNDARY里的SEGMENT编号要和网格边界对应,搞错了波浪会从错误的方向进来。

3.3 地形文件与边界文件的配合

地形文件通常是两列数据,第一列是 x 坐标,第二列是底高程(或水深)。潜堤的形状靠这个文件刻画:

# x(m) z_bed(m) 0.0 0.0 5.0 0.0 5.5 -0.35 6.0 -0.40 6.5 -0.35 7.0 0.0 15.0 0.0

这段数据描述的是:前 5 米平底,然后一个斜坡下降,堤顶在 6 到 6.5 米之间,再斜坡上升,后面又是平底。注意这里给的是底高程,负值表示水下。如果 SWASH 版本要求给水深,那就得把符号反过来。

边界文件里要指定波浪参数。规则波的输入方式通常是:

# 左侧边界:规则波,波高 0.02 米,周期 2.0 秒 BOUNDARY SEGMENT 1 CONSTANT 0.02 2.0 0.

三个数字分别是波高、周期、相位。相位一般设 0,除非你要做多波叠加。

地形和边界必须匹配:入射边界处的水深要和地形文件第一点的水深一致,否则波浪一进来就变形。我见过有人地形文件从 0 开始,边界条件却按 0.5 米水深给,结果波面直接跳变。

3.4 运行命令与输出文件解读

配置好了就可以跑:

# 串行运行 ./swash.exe input.sws # 并行运行(如果编译了 MPI 版本) mpirun -np 4 ./swash.exe input.sws

运行时间取决于网格数和时间步长。这个算例网格不多,串行几分钟就能跑完。跑完之后会生成输出文件,常见的有.dat格式的波面时间序列、.nc格式的 netCDF 文件(如果编译时开了 netCDF)。

输出文件里通常包含时间、x 坐标、波面 elevation、流速等变量。用 Python 或 MATLAB 读出来画图:

import numpy as np import matplotlib.pyplot as plt # 读取波面时间序列 data = np.loadtxt('surface.dat') t = data[:, 0] eta = data[:, 1] plt.plot(t, eta) plt.xlabel('Time (s)') plt.ylabel('Surface elevation (m)') plt.title('Wave surface at gauge') plt.show()

如果波面随时间周期性变化,说明算例跑通了。如果波面发散或者完全没变化,检查边界条件和时间步长。

4. 避坑与排查:潜堤算例最常见的五个翻车点

4.1 波面发散或出现高频振荡

现象:跑了几步之后波面开始剧烈振荡,数值越来越大,最后溢出。

原因:时间步长太大,不满足 CFL 条件。或者底摩擦系数设得太小,能量无法耗散。

解决:把时间步长减半再试。CFL 条件要求时间步长小于网格间距除以波速,潜堤顶部水深浅、波速低,但深水区波速高,要按最大波速算。底摩擦系数别设 0,实验室水槽一般用 0.01 到 0.02。

4.2 波浪在边界处反射严重

现象:波面时间序列里能看到明显的驻波模式,波高忽大忽小。

原因:吸收边界没设对,或者吸收边界的位置离潜堤太近。

解决:右侧边界用RIEMANN或WEAKLY_REFLECTIVE类型。如果还是反射,把计算域加长,让吸收边界远离潜堤。我一般会在潜堤后面留至少 5 个波长的距离。

4.3 潜堤顶部波高异常增大或减小

现象:波面在堤顶处要么大得离谱,要么几乎不变。

原因:地形文件里水深符号搞反了,或者潜堤顶部水深设得太浅导致数值不稳定。

解决:确认地形文件给的是底高程还是水深。潜堤顶部水深别小于 0.02 米,太浅了模型处理破碎会有问题。如果必须模拟破碎,考虑用 SWASH 的破碎模块或者改用其他模型。

4.4 输出文件为空或只有一行

现象:跑完了但输出文件里没数据。

原因:PRINT关键字的时间间隔设得比总时长还大,或者输出格式没设对。

解决:检查PRINT后面的数字,确保输出间隔小于总时长。如果用的是 netCDF 输出,确认编译时 netCDF 库链接正确。

4.5 高次谐波对不上实测数据

现象:主频波高对得上,但高频部分能量明显偏低。

原因:垂向分层太少,模型对频散和非线性的刻画不够。

解决:把VERT从 1 改成 2 或 3,增加垂向分辨率。但注意层数多了计算量会上去。另一个办法是减小网格间距,让堤顶附近的网格更密。

5. 进阶技巧:用这个算例做网格收敛性测试

跑通只是第一步,真正有价值的是拿它做网格收敛性测试。我一般会固定物理参数,只改网格数,跑三组:粗网格(50 个点)、中等网格(100 个点)、细网格(200 个点),然后对比堤顶处的波面时间序列。

# 粗网格 CGRID 0. 0. 0. 15. 0.5 0. 50 1 # 中等网格 CGRID 0. 0. 0. 15. 0.5 0. 100 1 # 细网格 CGRID 0. 0. 0. 15. 0.5 0. 200 1

跑完之后把三组结果画在一张图上。如果中等网格和细网格的结果基本重合,说明 100 个点已经收敛了。如果差很多,继续加密。这个测试能帮你判断后续做实际项目时网格该取多密。

另一个技巧是改潜堤顶部水深,观察波浪从非破碎到破碎的过渡。把堤顶水深从 0.1 米逐步降到 0.02 米,看波面什么时候开始出现不对称和前沿变陡。这个过程中模型可能会发散,发散点大致对应物理上的破碎点。虽然 SWASH 对破碎的模拟不是强项,但至少能给你一个定性判断。

还有一个我常用的验证方法:把观测点设在潜堤前后的不同位置,提取波面时间序列做频谱分析。用 FFT 看主频和高次谐波的能量分布,和实测数据对比。如果二次谐波能量偏低,说明网格或垂向分层还不够。

注意:做收敛性测试时,时间步长也要跟着网格调整。网格加密后,CFL 条件允许的时间步长会变小,别用同一个步长跑所有网格。

从那以后我每次拿到新的波浪算例,都会先跑一遍网格收敛性测试,再动其他参数。这个习惯帮我省了很多返工的时间。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询