收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流QQ群:835383472

数值海洋与大气模式(二):从0到1实现浅水模式(上) ...

[复制链接]
一维浅水模式

上文提到了浅水方程是由控制方程化简近似而来,形式相对简单且适合做数值算法的测试,其自身也具备实用价值。本文计划从0到1,一步一步实现出一个完整的浅水模式。为了便于说明代码实现的细节,本文考虑分成上下两篇,本篇从最简单的一维浅水方程入手。选择的算例参考了《Ocean Modelling for beginners》中的练习题。考虑到MATLAB的界面对于初学者相对友好,本文选择使用MATLAB进行讲解和说明。

假定波动周期小于惯性周期,即科氏力可忽略,忽略非线性项和摩擦力项,控制方程变成了如下形式。其中

) [- `' j" V: d3 E2 a
                               
登录/注册后可看大图
可以理解为水面波动与参考面的距离,在水面平静时
, ~8 J- r7 b# h+ C! p
                               
登录/注册后可看大图

为0。

! w5 a8 W  D7 q! k; f% |
                               
登录/注册后可看大图
为水质点的水平速度。


- x5 X" _6 n4 O8 L. d7 H3 i                               
登录/注册后可看大图

该场景如下图所示,是一个水平长度为1000m,两端封闭,水深为10m。倘若初始时刻在480m到520m处给一个扰动,使得那一段水面突然升高2m,计算扰动之后整个水面会发生怎样的运动。

5 `: n% j' [2 l6 e* }) s* H
                               
登录/注册后可看大图

空间步长

$ k0 g5 j: J1 k
                               
登录/注册后可看大图
,为了满足CFL条件,时间步长
0 g- ~7 F. i; `7 ~! R2 E$ G/ W5 L; \
                               
登录/注册后可看大图
。确定好了空间和时间步长后,我们就得到了计算所需的网格。此处之所以不对t做linspace,而只取时间间隔是因为在该格式下每次计算只需要存储n和n+1时刻的

( y  V2 Y8 z/ D' m+ C  {                               
登录/注册后可看大图

4 i. |0 I9 V  u) c1 q7 ]$ H6 r- |                               
登录/注册后可看大图
,在得到相应时刻的结果后,将内存中存储的结果输出到文件中,以节省内存开支。

L=1000;dx=10;dt=0.1;N=L/dx+1;x=linspace(0,L,N);
( e) Q1 z' C" I1 O

上述的x可以理解为在整个区域等距的取了101个点,现在就需要根据初始条件给出这101个点的初始值。

hinit=10; %参考面水深10mfor i=1:N     eta(i)=0;     u(i)=0;endeta(49:53)=2; %480m-520m出的初始扰动h=hinit+eta; %参考面水深加波动等于水深- M. ?& S" K6 S6 t* c

初始化网格后,需要对方程进行离散化。选择最简单的显式差分即可。


: a; @1 v; w. {. j                               
登录/注册后可看大图

可以看出第二个式子的右端项上标是n+1时刻,这是因为每次迭代计算的时候,先算

4 H$ J1 Z0 b8 J& q, E: t
                               
登录/注册后可看大图
而后算
: ~7 f9 f/ l8 L+ R$ ^4 p0 @8 ^6 R
                               
登录/注册后可看大图
,因此在计算第二个式子的时候已经有了n+1时刻的速度
8 M  Z: f" i$ T
                               
登录/注册后可看大图
了。因此右端项虽然是n+1时刻,但依然是显式差分的格式。代码中wet用于表示网格是干网格还是湿网格。为了表示网格区域内是否为陆地,定义了wet这一变量。在本案例中,只有网格两端是封闭的,因此两端wet(1)和wet(N)的值是0,其余的值是1。

for k=1:N     if(wet(k)==1)         if(wet(k+1)==1)             un(k)=u(k)-dt*g*(eta(k+1)-eta(k))/dx;         else             un(k)=0;         end     endend% 上面的代码便于理解,为简洁可写成如下形式,计算效率更高% un=u-dt*g(eta(2:end)-eta(1:end-1))/dx% un(1)=0;un(end-1:end)=0;
8 o0 z! T) U+ D

本文所采用的交错网格,上文提到过,中央差分是二阶精度,比前向和后向差分的精度都高一阶,如果把


4 }% j! X, ^8 n" n' F: N3 ?3 ^1 d9 o6 ?                               
登录/注册后可看大图
2 W0 e( H# \9 F- S
                               
登录/注册后可看大图
的网格点交错开,则在计算的时候更容易实现中央差分。计算

( l) m6 l- {0 d4 T( m& S7 y9 J                               
登录/注册后可看大图
的时候已经在这么做了。


6 s9 x1 A3 Z  j% Q9 c' Z9 H4 L6 Y                               
登录/注册后可看大图

对于


& p$ S1 j2 Q, @  e                               
登录/注册后可看大图
的计算,则更为复杂一些。下式看起来虽然复杂,但其实就是依据
1 _% b# u5 E' @0 B5 ~" K
                               
登录/注册后可看大图
是正还是负,来选取
& R* D, h3 R8 C; F6 |* u- j% v9 z
                               
登录/注册后可看大图
! M% Y" U& h5 n; L
                               
登录/注册后可看大图

5 E3 ^% V$ M1 n9 v" D
                               
登录/注册后可看大图

for k=2:N-1     he1=0.5*(un(k)+abs(un(k)))*h(k);     he2=0.5*(un(k)-abs(un(k)))*h(k+1);     hue=he1+he2;     hw1=0.5*(un(k-1)+abs(un(k-1)))*h(k-1);     hw2=0.5*(un(k-1)-abs(un(k-1)))*h(k);     huw=hw1+hw2;     etan(k)=eta(k)-dt*(hue-huw)/dx;end
6 |; b8 a8 \6 ?0 w  O

这样就完成了一次迭代的计算,可以看出,在每次迭代时,un和etan所存储的是n+1时刻的计算结果,而u和eta所存储的是n时刻的计算结果。因此,在每轮迭代的最后,un和etan的值需要赋给u和eta,然后将此轮计算的结果写入到文件中。下一轮运算时,新结果将会覆盖旧结果。只需要不断迭代上述步骤,即可一步一步求解出所需时间长度的结果。

由于水面是连续的,在网格分辨率不够高时可能会出现求解出的


2 P' l/ J( \& \                               
登录/注册后可看大图
呈现锯齿状,因此可以在迭代求解时对

2 a  q: E2 W$ L: F# T) r% ~* Y* h                               
登录/注册后可看大图
做一个一阶Shapiro滤波器平滑。求解过程就变成如下所示。使用滤波器平滑之后,水面的起伏看起来会更加连续。

! ]. G% a  D. f! Z
                               
登录/注册后可看大图

本文所讲的是一维等深浅水方程的求解,形式相对简单。在遇到更复杂的地形时,求解难度会加大,需要考虑的问题会更多。在之后的文章中,将会探讨二维浅水方程的求解,之后会再考虑加上风应力和更复杂地形的情况。

版权声明

本文创作的初衷是用于帮助数值模式的学习者。欢迎转载,转载请私信并注明作者和出处,请勿用于任何商业用途。

参考书目

Ocean Modelling for Beginners. Jochen Kämpf. Springer Berlin Heidelberg, 2009.

回复

举报 使用道具

相关帖子

全部回帖
暂无回帖,快来参与回复吧
懒得打字?点击右侧快捷回复 【吾爱海洋论坛发文有奖】
您需要登录后才可以回帖 登录 | 立即注册
ucking
活跃在2022-11-2
快速回复 返回顶部 返回列表