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

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

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

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

$ P/ X8 D1 {2 ]* s* @7 J, R9 U+ L
                               
登录/注册后可看大图

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

! e" {- `3 E3 |0 }1 g: `' s9 X
                               
登录/注册后可看大图

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

+ x2 D$ l2 x  ?6 {/ O: c4 @3 O" @2 N% K: f
                               
登录/注册后可看大图

# r5 `/ H) L# d                               
登录/注册后可看大图
总是相差半个网格距离。在二维的情况,速度是

! m) `8 \* N$ u: z9 G) p  l                               
登录/注册后可看大图

0 x! I5 M6 `9 n5 ^2 Q5 r. H& V                               
登录/注册后可看大图
两个变量,因此我们需要考虑速度

! J, Z. |3 }1 E0 x                               
登录/注册后可看大图

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

! ?! w' w# b9 @% l% M) b+ H
                               
登录/注册后可看大图

* L, w  `' {' ?                               
登录/注册后可看大图
的导数,因此为了让对
; e0 O1 a2 V. a: i
                               
登录/注册后可看大图
的中央差分落在和
* G+ s6 C3 ~% j* c  \& q
                               
登录/注册后可看大图
同样的位置上,
) \; ^; _  A! I8 K( n. @- Z
                               
登录/注册后可看大图
也需要和

- P" L% _& P" @; I' S# `                               
登录/注册后可看大图
间隔半个网格距。这就是大名鼎鼎的Arakawa C网格。在使用交错网格的时候,我们要明确一个准则,就是要确保计算时各个变量都要在相同的空间位置上。比如要算

1 m& Y) ~! I- y8 ]& b0 T' D6 M; m" `                               
登录/注册后可看大图
在t+1时刻的值,就需要

; v0 ]) W2 p. @: f                               
登录/注册后可看大图
两侧的
. g, F6 J, f. w2 l
                               
登录/注册后可看大图
做中央差分,这样确保等号左边的
1 z$ l& l9 ^% e  `
                               
登录/注册后可看大图
和等号右边的导数是相同的空间位置。这一点在之后讲解更复杂的模式中会体现的更明显。例如POM模式,会有更多的参变量,为了保证处于同一空间位置上需要做平均运算。而本文的后半部分,在考虑底摩擦的浅水方程中也涉及到了。

" h: a: B7 \' V


) U3 l' \! q- s. w/ p                               
登录/注册后可看大图

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


- I5 L1 q  _  T, k4 G8 R; P                               
登录/注册后可看大图
是水平方向的流速,而东边界(图中右边)的

" ~0 {8 S% r3 O6 S                               
登录/注册后可看大图
是在陆地边界上,所以要使
0 B. j) V" m% r7 Q4 |# n9 J, [5 H
                               
登录/注册后可看大图
时变为0,不能让水质点穿出边界,而
5 y8 {, {3 {% k$ A4 ]$ T# D
                               
登录/注册后可看大图
或者

& O! s* ]3 s! d  X                               
登录/注册后可看大图
时则不需要给予约束,这样就不用考虑西边界,因为西边界没有
, d9 _  s# z( |8 O! J( O
                               
登录/注册后可看大图
的格点。对北边界的
% @$ i+ e2 ~0 d& w. V9 o8 X
                               
登录/注册后可看大图
处理方式一样,在此不做赘述。


; S- Z) s' y& a

8 E. K. _( M  I) r; F9 x& [
                               
登录/注册后可看大图

un(j,k)=0;uu=u(j,k);duu=du(j,k);if(wet(j,k)==1)
4 H% g& s) K& K( e. @    if((wet(j,k+1)==1)||(duu>0))2 M* T: L& f# i4 ?
        un(j,k)=uu+duu;# h( L! t, N$ q! I8 ]0 q! w8 q1 q
    endelse* [8 Q6 t  g/ f4 g
    if((wet(j,k+1)==1)&&(duu<0))( X! }$ f; ~# f) c# N) Y# l) V
        un(j,k)=uu+duu;
% @" z7 }4 Z# E1 R8 x    endend

  对


# t$ k* {$ S! A6 D+ d# s7 {9 E                               
登录/注册后可看大图
求解的代码实现过程如上,其中if就是在判断边界和速度方向,把不在边界和在边界但是

' v3 h3 p: A7 X6 ~4 M                               
登录/注册后可看大图
不大于0的值赋计算结果,使得在边界且大于0的点赋为0。
" g- c) k" @/ w2 a8 z. |
                               
登录/注册后可看大图
的计算和

) ]6 u9 [5 O. S1 X1 i' q                               
登录/注册后可看大图

的计算同理。

9 f7 w; O$ m  \; R+ f7 N) L! o' q

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


3 q4 k; W! f# A; n; o7 |                               
登录/注册后可看大图

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

" z/ {1 l4 T. X) x
                               
登录/注册后可看大图

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

  Z$ F. Y' m( b) c- m
                               
登录/注册后可看大图

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

9 _9 M7 w" c+ Z; C5 }+ w  l/ J4 ^
                               
登录/注册后可看大图

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


3 V1 y% D4 T2 D  n                               
登录/注册后可看大图

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

" V( x. |" A. h; k
                               
登录/注册后可看大图

1 i, g! K) q. {7 y
                               
登录/注册后可看大图

,具体表达式如下。


! v6 G0 v) m' C+ v5 \& w+ ^+ ^


. `! |/ q) E8 l0 }6 W                               
登录/注册后可看大图

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

6 v. L8 g6 G0 W' |
                               
登录/注册后可看大图
+ I) G# H8 f& a. |  J+ ]
                               
登录/注册后可看大图
这种变量。这就是前文已经提到的那个问题,Arakawa C网格的

5 U& t$ j! Q) l$ }  T                               
登录/注册后可看大图

0 O8 M7 Z& a$ E  H# B/ ]1 h. p* d7 w& i                               
登录/注册后可看大图
在网格的不同位置处,但是做运算只能在相同网格处。因此
( r0 B% D! O; v
                               
登录/注册后可看大图

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

) c+ F5 c! ?: d. A7 U
                               
登录/注册后可看大图
,而

6 f9 ]+ Y2 m7 P; e* W: z. d. n8 ]                               
登录/注册后可看大图
的意思是u网格所在位置的速度
4 s6 u3 r$ Z8 n, ?) D7 A
                               
登录/注册后可看大图
。以

0 n, f4 y# ]5 }( x                               
登录/注册后可看大图
为例,如下图所示,可由周围的四个
% ~% v; x# A7 @1 Y5 E. T4 B  G
                               
登录/注册后可看大图
平均求得。

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


+ N6 _8 O) h' W& [                               
登录/注册后可看大图

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


8 j7 n1 d6 {8 n4 u+ J. u                               
登录/注册后可看大图

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

for k=1:N6 p/ u1 f1 q5 C; {% V- g
    h(k)=hzero(k) + eta(k);
; j8 e1 i7 j7 X- d9 E2 @    wet(k)=1;
- |  H5 y1 V! M! o' J    if(h(k)<hmin)
, Z  x8 m& Q5 q) }        wet(k)=0;
* W! d6 I' U/ F& X5 Q9 T3 H# \    end
, c5 N* M( c  Y; ?" x2 ]6 R    u(k)=un(k);end

版权声明

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

参考书目

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


: j/ o+ w1 t# t/ a0 D( F( K
回复

举报 使用道具

相关帖子

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