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

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

  上文讨论了浅水方程在一维情况下的求解,本文探讨浅水方程在二维情况下的求解,并考虑加上底摩擦和风应力的情况。

  首先考虑最简单的二维浅水方程,形式如下。


! o5 |" m3 l7 ^; W( _                               
登录/注册后可看大图

  还是同样的过程,对其做离散化,得到下式。

# Z- I. a' F0 U- }
                               
登录/注册后可看大图

  上文提到,为了方便实现中央差分来取得二阶精度,选择了交错网格,使得


+ {& W/ h, b1 ~. a                               
登录/注册后可看大图
; ]4 r0 A( @& f# }
                               
登录/注册后可看大图
总是相差半个网格距离。在二维的情况,速度是
9 s7 P% B( Z( \9 E
                               
登录/注册后可看大图
6 p! P1 x# `7 H# X3 Y
                               
登录/注册后可看大图
两个变量,因此我们需要考虑速度
- F2 v4 ]9 i% J/ V5 o& V7 ?) W
                               
登录/注册后可看大图

放在网格的哪个位置。从上式的第二个式子可以看出,式子右边是


4 @$ p- q- f8 \1 o7 o3 q3 D7 s. R                               
登录/注册后可看大图

9 o; i7 T0 B* |                               
登录/注册后可看大图
的导数,因此为了让对
8 ~2 D% h: _& Y. o& M
                               
登录/注册后可看大图
的中央差分落在和
% o% t5 m# f2 ?9 c$ `
                               
登录/注册后可看大图
同样的位置上,
& K* z/ \4 ^' x! |# U
                               
登录/注册后可看大图
也需要和
- z* C8 R4 L% H& s
                               
登录/注册后可看大图
间隔半个网格距。这就是大名鼎鼎的Arakawa C网格。在使用交错网格的时候,我们要明确一个准则,就是要确保计算时各个变量都要在相同的空间位置上。比如要算

' Y/ C! M  ?5 I+ q                               
登录/注册后可看大图
在t+1时刻的值,就需要

1 f. ]7 J0 |! c* X  E3 }                               
登录/注册后可看大图
两侧的
# h( U& [/ Y9 B
                               
登录/注册后可看大图
做中央差分,这样确保等号左边的

4 m2 |- e. w, _: [1 X1 D) @                               
登录/注册后可看大图
和等号右边的导数是相同的空间位置。这一点在之后讲解更复杂的模式中会体现的更明显。例如POM模式,会有更多的参变量,为了保证处于同一空间位置上需要做平均运算。而本文的后半部分,在考虑底摩擦的浅水方程中也涉及到了。


5 x5 r0 \, N# V2 K9 m' j. ?


& J, c  {  {$ x1 h9 b2 j                               
登录/注册后可看大图

  使用了Arakawa C网格后,可以神奇的发现,在这种情况下,只需要讨论两个边界的速度即可,如下图所示。考虑到


5 l4 Q# l' b! L( S  ]' `                               
登录/注册后可看大图
是水平方向的流速,而东边界(图中右边)的
* B& G1 \1 _- x% [+ |3 G
                               
登录/注册后可看大图
是在陆地边界上,所以要使
/ ^/ J  J6 z; c/ \% f
                               
登录/注册后可看大图
时变为0,不能让水质点穿出边界,而

% @9 v8 V2 V( b4 K* o                               
登录/注册后可看大图
或者

+ o3 ?5 U& p+ |                               
登录/注册后可看大图
时则不需要给予约束,这样就不用考虑西边界,因为西边界没有

& m3 G/ w2 m; r% D. d9 O                               
登录/注册后可看大图
的格点。对北边界的

' K4 P$ f) A/ d( x9 _2 h) y                               
登录/注册后可看大图
处理方式一样,在此不做赘述。


# |4 x. i7 F; L# D9 ?/ r& Q


3 U  U; u1 X- O! |% y                               
登录/注册后可看大图

un(j,k)=0;uu=u(j,k);duu=du(j,k);if(wet(j,k)==1)
8 m/ D! ~/ m0 m  v! x3 |2 C( M( H# t. P    if((wet(j,k+1)==1)||(duu>0))$ H& g0 l; N) _7 C& x3 f
        un(j,k)=uu+duu;& y; ?+ P! Z* \) W
    endelse) T! K+ ^# m2 J8 z% x$ T
    if((wet(j,k+1)==1)&&(duu<0))
; O; h+ N* j0 W        un(j,k)=uu+duu;; z5 \, i' u! h; o2 X1 ^/ p9 s' j
    endend

  对


. H$ ^) ]" f9 T1 z9 l4 z# q, j                               
登录/注册后可看大图
求解的代码实现过程如上,其中if就是在判断边界和速度方向,把不在边界和在边界但是

: j4 I) B9 G: u, u6 ^                               
登录/注册后可看大图
不大于0的值赋计算结果,使得在边界且大于0的点赋为0。

. z: s9 t& Z7 i* r) i* }                               
登录/注册后可看大图
的计算和
& _& e, {3 a+ y! P0 \# ^8 y% w
                               
登录/注册后可看大图

的计算同理。


5 ~" X* W7 A; z4 [! I2 u

  接下来,开始考虑更复杂的形式,引入风应力和底摩擦。方程组的形式立马变得更加复杂起来。


. S* A: y$ ^- O+ N9 S) v                               
登录/注册后可看大图

  底摩擦和风应力这两项由上式可以看出,是相减的关系,因此可以在计算时,分别看成两项来对待。如果只考虑底摩擦,不考虑其他项的话,方程是如下形式。


! \+ e3 E5 d  C1 u: J) F( k5 h! _                               
登录/注册后可看大图

  对其进行半隐式差分得到如下形式。显式差分应用于底摩擦会出现数值稳定性问题。

9 H9 b$ G, P, w4 _: {, p
                               
登录/注册后可看大图

  考虑完了底摩擦,还需要考虑风应力问题。在原方程去掉底摩擦项后再进行差分得到下式,其中下标j和k分别代表x和y方向。

2 n1 m6 |- y* b# H  K( D
                               
登录/注册后可看大图

  将其求完后回代到推的底摩擦差分方程中即可。


9 f7 x* e7 }  m2 T' l# W1 v1 w                               
登录/注册后可看大图

  为了表达式清晰简洁,引入了

$ s% _, C7 ]+ }4 m
                               
登录/注册后可看大图

% q) p5 ~: F0 t' b# T
                               
登录/注册后可看大图

,具体表达式如下。


/ B+ D. A% N% j/ h' x' g; X


& r# g2 ]) O7 E: A& z6 @! u% v: z5 G                               
登录/注册后可看大图

  值得注意的是,上式中出现了

3 J1 [$ g! M& I0 \" o2 ?
                               
登录/注册后可看大图
- M9 G( Q+ o- \" Q
                               
登录/注册后可看大图
这种变量。这就是前文已经提到的那个问题,Arakawa C网格的
4 F& \; X+ y" l; s: x! n
                               
登录/注册后可看大图

0 ?" y0 z/ _6 e5 z9 }! }- ~% C                               
登录/注册后可看大图
在网格的不同位置处,但是做运算只能在相同网格处。因此

# u5 x( z2 u( M6 G% ?) w* v                               
登录/注册后可看大图

的意思是v网格所在位置的速度


5 h" [/ s4 n; R5 U* n  M                               
登录/注册后可看大图
,而

+ f# ]" ]0 [% Y' T                               
登录/注册后可看大图
的意思是u网格所在位置的速度
7 R/ s. I: _( X; l& o
                               
登录/注册后可看大图
。以
9 ~! A; {% }4 k! [8 N* E; g
                               
登录/注册后可看大图
为例,如下图所示,可由周围的四个
, h$ R5 l9 g  m! N% U
                               
登录/注册后可看大图
平均求得。

u_v = 0.25*(v(j+1,k)+v(j,k)+v(j,k-1)+v(j+1,k-1))

" f" ?8 r2 }' J! _2 E, `: I0 u
                               
登录/注册后可看大图

  这样就实现了二维考虑底摩擦和风应力的浅水方程求解。之前说过,干网格和湿网格分别对应网格中的陆地和水,我们在计算时只需要计算流体部分,而不计算陆地的部分。之前我们提到的案例中,陆地边界都在网格的四周。倘若需要模拟的场景是大洋中的一个小岛,即陆地出现在网格内部时,会有什么不同?倘若大洋中的小岛海拔高度有限,在模拟台风时,小岛被水淹没时,干网格和湿网格该怎么转换?当考虑了干湿网格的转换之后,一个具备基本功能的浅水模式就完成了。


' o2 X  Z' S4 Z( L& Z4 q                               
登录/注册后可看大图

  以一维的情况为例,从图中可以看出来,这个扰动显然会在某些时刻漫过这个岛屿。为了解决这个问题,我们只需要在每轮时间步迭代的最后,加上干湿网格的更新即可。需要定义一个比较小的hmin,意思是当陆地上的积水高度超过hmin就意味着被淹没,下次计算时就把这个网格点当做水面,即把wet(k)这一点赋值为1。

for k=1:N
( Q$ F7 z' ~  y. O5 P    h(k)=hzero(k) + eta(k);$ d' e5 u! s! Y5 J* h7 E
    wet(k)=1;
8 d0 ^, G! v$ R$ e/ J" M    if(h(k)<hmin)
& Z1 y6 {1 g5 q0 J( E  ^        wet(k)=0;
8 a, c- o3 d" U) N1 ?- ?    end. t; ]5 q9 |' k0 U/ @9 Q+ C
    u(k)=un(k);end

版权声明

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

参考书目

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

. ?# h" w* |0 |3 j1 Y' x
回复

举报 使用道具

相关帖子

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