本blog介绍了NHWAVE模型自带算例 Wave transformation over an elliptical shoal on a sloped bottom的编译运行;并分享了该算例配置文件、模拟结果的学习记录。
关于该算例的详细描述见NHWAVE手册或Ma等人的论文 1。
此外,本人在NHWAVE原版源代码基础上,更新了垂向网格分层百分比可指定、被动示踪剂输移、温度场输入输出等模块,并修正了植被水流模型中的一些BUG。有兴趣的朋友请上我的GitHub下载代码。
欢迎各位朋友对此提出指导意见;大家可以一起交流,共同进步!
算例简介
该算例模拟的是一列规则波经过一个椭圆形浅滩时的变形、传播规律。这个算例也是广泛地被应用于模型三维模拟性能的测试。相应的物理实验详见 Berkhoff et al. (1982) 2。
模拟所需参数文件在代码包 /examples/berkhoff/work 目录下,初始水深文件在 /examples/berkhoff/input 目录下。关于本算例的后处理,可参考本人编写的MATLAB脚本(传送门)。
在NHWAVE中,我们先建立一个垂向三维的数值水槽来模拟该算例。计算域范围为 x = -12 ~ 18 m,y = -10 ~ 10 m。其底部形状的平面图如下图所示。椭圆形浅滩位于一个坡度为1/50的平面海滩上,海滩等高线的梯度方向与x轴间的夹角为20°。
波浪从左侧边界(x = -13 m)入射,入射波是周期为1.0 s、波高为4.64 cm的规则波。在右侧边界,设置一个厚度为3 m的海绵层(x = 14~17 m)。此外,边界y = ±10 m处采用自由滑动边界条件。模型的模拟时间为 t = 0 ~ 30 s。
为了观察波浪形状与变形情况,我们设置了如下图所示的 (1)~(8) 共8个测量断面。它们的位置如下:
断面编号 | 位置 |
---|---|
(1) | x = 1.0 m |
(2) | x = 3.0 m |
(3) | x = 5.0 m |
(4) | x = 7.0 m |
(5) | x = 9.0 m |
(6) | y = -2.0 m |
(7) | y = 0 m |
(8) | y = 2.0 m |
地形与网格
计算区域地形如上图所示。若将原坐标系 (x, y) 绕原点顺时针旋转20°,得到和海滩正交的坐标系 (x’, y’),则上图的平面海滩水深 h 可以用以下式子表示:
h
=
{
0.45
,
x
′
<
−
5.84
m
a
x
(
0.07
,
0.45
−
0.02
(
5.84
+
x
′
)
)
,
x
≥
−
5.84
h= \begin{cases} 0.45,\quad &x'<-5.84 \\ max(0.07, 0.45-0.02(5.84+x')),\quad &x \geq -5.84 \end{cases}
h={0.45,max(0.07,0.45−0.02(5.84+x′)),x′<−5.84x≥−5.84
由于最小水深为0.07 m,波浪不会发生破碎。此外,椭圆形浅滩的外轮廓为:
(
x
′
3
)
2
+
(
y
′
4
)
2
=
1
( \frac {x'}{3} )^2 + ( \frac {y'}{4} )^2 = 1
(3x′)2+(4y′)2=1
在上述范围(椭圆形轮廓)内,浅滩的高度d为:
d
=
−
0.3
+
0.5
1
−
(
x
′
3.75
)
2
−
(
y
′
5
)
2
d = -0.3 + 0.5 \sqrt{\smash[b]{1 - ( \frac {x'}{3.75} )^2 - ( \frac {y'}{5} )^2}}
d=−0.3+0.51−(3.75x′)2−(5y′)2
对于非浅滩范围内的位置,d = 0。因此,初始状态下,计算域内的静水深为 h - d。
对于此算例网格采用 Δx = 0.025 m ,Δy = 0.05 m 的均匀网格;在垂向上,设置3个均匀的σ层。
本算例的网格配置见input.txt的DIMENSION、GRID和VERTICAL GRID OPTION部分。
! --------------------DIMENSION---------------------------------
! cell numbers
Mglob = 1200
Nglob = 400
Kglob = 3
! ------------------------GRID----------------------------------
! grid sizes
DX = 0.025
DY = 0.05
! ---------------------VERTICAL GRID OPTION--------------------
! IVGRD = 1: uniform; 2: exponential
IVGRD = 1
GRD_R = 1.1
模型的地形配置见input.txt的BATHYMETRY部分及depth.txt文件。
运行参数配置
本算例的核心是波浪模拟,故本blog重点学习波浪参数及边界条件的设置。在NHWAVE中,首先需要确定边界条件:
! -------------------BOUNDARY_TYPE--------------------------------
! bc_type=1: free-slip
! 2: no-slip
! 3: influx
! 4: outflux (specified eta)
! 5: bottom or wall friction
! 6: radiation bc
BC_X0 = 3
BC_Xn = 1
BC_Y0 = 1
BC_Yn = 1
BC_Z0 = 1
BC_Zn = 1-
上述参数除了左侧(X0)为入射边界外,其余边界均设置为自由滑移的墙面。要注意的是,右侧(Xn)实际上并非自由滑移的墙面,而是海绵边界处;它在SPONGE LAYER部分中设定:
! ---------------- SPONGE LAYER ------------------------
! DHI type sponge layer
! need to specify widths of four boundaries and parameters
! set width=0.0 if no sponge
SPONGE_ON = T
Sponge_West_Width = 0.0
Sponge_East_Width = 3.0
Sponge_South_Width = 0.0
Sponge_North_Width = 0.0
上述参数表示,海绵边界层设置在右侧(East),厚度为3 m。
对于左侧入射的波浪,其参数设定在WAVEMAKER部分:
! ---------------------WAVEMAKER------------------------------
! wavemaker
! AMP - wave height; PER - wave period; DEP - incident water depth
! THETA - incident wave angle
! LEF_SOL - left boundary solitary wave, need AMP,DEP
! LEF_LIN - left boundary linear wave, need AMP,PER,DEP
! LEF_CON - left boundary cnoidal wave, need AMP,PER,DEP
! LEF_STK - left boundary stokes wave, need AMP,PER,DEP
! LEF_TID - left boundary tide wave, has to specify in subroutine
! LEF_JON - left boundary for JONSWAP spectrum
! RIG_LIN - right boundary linear wave, need AMP,PER,DEP,THETA
! INI_ETA - initial surface elevation specified in subroutine initial
! INT_LIN - internal wavemaker for linear wave
! INT_CON - internal wavemaker for cnoidal wave
! INT_SOL - internal wavemaker for solitary wave
! INT_JON - internal wavemaker for JONSWAP spectrum
! INT_SPC - internal wavemaker for 2D spectrum (need spc2d.txt)
! INT_IRR - internal wavemaker for irregular wave (need irr2d.txt)
! FLUX_LR - impose flux at both left and right boundaries
! FOCUSED - left boundary focusing wave packet (isolated whitecap)
! WAV_CUR - left boundary coexisting waves and currents
WAVEMAKER = LEF_LIN
AMP = 0.0464
PER = 1.0
DEP = 0.45
THETA = 0.0
CUR = 0.0
sd_return = 0.0
即设定为线性规则波,并给定了波高(AMP,单位为m)、周期(PER,单位为s)和初始水深(DEP,单位为m)。
此外,在模拟过程中采用可变时间步长,满足Courant数等于 0.5。这是在 input.txt 的COURANT_NUMBER部分:
! --------------------COURANT_NUMBER---------------------------------
CFL = 0.5
模型的编译运行
首先,将/examples/berkhoff/work 目录下的 input.txt 和 /examples/berkhoff/input 目录下的 depth.txt 复制到nhwave所在的运行文件夹内。之后设定并行相关的参数,编译运行程序。
模拟结果处理
读取结果文件夹中的 time文件和eta_[number] 文件(这里的number表示时刻,如"eta_00001")数据。
time文件中有一列数据,如下所示:
20.016969706377331
20.038931270969076
20.055400133224612
20.077355868674253
20.099308572432008
20.115771605211396
... (以下省略)
其中数据为时刻(s)。且此处数据的顺序与eta_[number] 文件的number对应。eta文件中有自由水面高程(m)。利用eta文件中的水位场,计算最后五个波的数据,得到各处波浪的波高。
对比模型计算与物理实验中(1)~(8)断面处在的波高分布,如下图所示(图源为NHWAVE手册)。
图中的圆圈为物理实验结果,实线为模拟结果。可以看出,NHWAVE模拟结果与实验的拟合程度十分高。
Ma G , Shi F , Kirby J T . Shock-capturing non-hydrostatic model for fully dispersive surface wave processes[J]. Ocean Modelling, 2012, 43-44(22-35):22-35. ↩︎
Berkhoff J , Booy N , Radder A C . Verification of numerical wave propagation models for simple harmonic linear water waves[J]. Coastal Engineering, 1982, 6(3):255-279. ↩︎