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

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

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

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


% b; F+ n% J9 h                               
登录/注册后可看大图

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


7 T5 O9 W! G" U* S" W) p                               
登录/注册后可看大图

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


  r- C- P: ^) O# X3 c: v( F                               
登录/注册后可看大图

- x- g/ G+ j4 y. @' |( ?                               
登录/注册后可看大图
总是相差半个网格距离。在二维的情况,速度是

7 o' y1 y4 ~5 @. l$ w3 l1 Y                               
登录/注册后可看大图

* c' a0 w8 L8 [& L                               
登录/注册后可看大图
两个变量,因此我们需要考虑速度
+ y  o2 F4 z3 m# |3 s& K3 ^1 `9 ?1 a
                               
登录/注册后可看大图

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


* v' G/ V- `% [" k! ^                               
登录/注册后可看大图

. A+ W; C; D' W' q: h                               
登录/注册后可看大图
的导数,因此为了让对

$ `' N8 h. U& n' }                               
登录/注册后可看大图
的中央差分落在和

0 ]6 X( \, {: g  @                               
登录/注册后可看大图
同样的位置上,
8 {! E+ h. i+ [% D; m
                               
登录/注册后可看大图
也需要和
, o' S+ r5 n0 x4 I# k% F, q: ]
                               
登录/注册后可看大图
间隔半个网格距。这就是大名鼎鼎的Arakawa C网格。在使用交错网格的时候,我们要明确一个准则,就是要确保计算时各个变量都要在相同的空间位置上。比如要算

" k$ X. ]: w  R                               
登录/注册后可看大图
在t+1时刻的值,就需要

2 p* M' X2 ~2 L" K" y7 U4 W. s# }) ^                               
登录/注册后可看大图
两侧的
2 q8 [/ a1 j' k  M1 j
                               
登录/注册后可看大图
做中央差分,这样确保等号左边的

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


5 T+ f+ ?& r+ d% p# m

3 m7 h8 ~+ M+ Q
                               
登录/注册后可看大图

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

9 d8 j1 y; V/ H* x6 Q
                               
登录/注册后可看大图
是水平方向的流速,而东边界(图中右边)的

5 n2 T% q, ]  s+ x                               
登录/注册后可看大图
是在陆地边界上,所以要使

5 F  |8 K& G4 i6 g                               
登录/注册后可看大图
时变为0,不能让水质点穿出边界,而
4 q& x9 z' X3 j% x3 y- M2 }# p
                               
登录/注册后可看大图
或者

- l: S  t! `0 `+ L& U2 }                               
登录/注册后可看大图
时则不需要给予约束,这样就不用考虑西边界,因为西边界没有
. s/ s5 F% W- {7 I* J) ~; C
                               
登录/注册后可看大图
的格点。对北边界的
6 ~% K/ e8 ?% T. g/ }5 w# @
                               
登录/注册后可看大图
处理方式一样,在此不做赘述。


0 F& D0 V8 E. ]

. M/ g# n& E6 K6 r; J
                               
登录/注册后可看大图

un(j,k)=0;uu=u(j,k);duu=du(j,k);if(wet(j,k)==1)2 |# q  i4 Q0 K3 O5 y' a
    if((wet(j,k+1)==1)||(duu>0))7 P9 _. N+ V" E' k3 f1 X; u
        un(j,k)=uu+duu;) L8 c9 W! P1 G7 u8 k  T. ?# {
    endelse, a3 @% R" X% Q+ h7 a5 G
    if((wet(j,k+1)==1)&&(duu<0))
: E/ j  H9 `0 g5 i        un(j,k)=uu+duu;
6 Q" ~1 a: b+ ^    endend

  对

. i1 _$ Z2 k7 K1 v3 k; V8 ?
                               
登录/注册后可看大图
求解的代码实现过程如上,其中if就是在判断边界和速度方向,把不在边界和在边界但是

0 z, U- ~; `, @3 ~4 D8 d4 X. |                               
登录/注册后可看大图
不大于0的值赋计算结果,使得在边界且大于0的点赋为0。
# l9 p% h( g# Z0 y+ o7 Y
                               
登录/注册后可看大图
的计算和
2 c; E7 P: s2 D# g. P* `
                               
登录/注册后可看大图

的计算同理。

2 S, `% i# t0 _3 m% Y) z9 a

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


5 U$ n( F- Y2 B* s* o  D$ C                               
登录/注册后可看大图

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

4 D: D$ j5 E  Z% B
                               
登录/注册后可看大图

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


% Z3 r, B, a% M6 i* |  R* e2 E                               
登录/注册后可看大图

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


9 A$ m+ A  `: L( f$ m$ ^                               
登录/注册后可看大图

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


) O0 h5 a& G* W) k6 c" L                               
登录/注册后可看大图

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

: G( T6 d  T) P  F: ]
                               
登录/注册后可看大图

! o+ [! R+ O: R& s- J
                               
登录/注册后可看大图

,具体表达式如下。

, D9 M/ ]- q. B9 {; ?6 ?+ P


1 d: f6 O7 F6 I+ ^, \. f+ s+ Z                               
登录/注册后可看大图

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


# W; ^0 L- z9 x* u' A+ ]                               
登录/注册后可看大图

+ l. X: C  t0 B8 m0 h5 P  v                               
登录/注册后可看大图
这种变量。这就是前文已经提到的那个问题,Arakawa C网格的

5 w% w; K% |1 o4 v# F                               
登录/注册后可看大图

4 A) V, p- Y. M( ~4 \                               
登录/注册后可看大图
在网格的不同位置处,但是做运算只能在相同网格处。因此
/ s. I, Y9 m  A4 s! G
                               
登录/注册后可看大图

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

& ^+ A- k, H& ?. I' M# ?
                               
登录/注册后可看大图
,而
# A, p1 V. r# p7 ]; W
                               
登录/注册后可看大图
的意思是u网格所在位置的速度

$ k7 L; ?  ^9 a8 |* t; S                               
登录/注册后可看大图
。以

* \1 w. r4 D* @9 p) K                               
登录/注册后可看大图
为例,如下图所示,可由周围的四个

% V! f: h4 c$ W0 W                               
登录/注册后可看大图
平均求得。

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


6 ]8 y6 d9 t0 G* _3 n* m9 ?                               
登录/注册后可看大图

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

: h; A% N: W* C1 h7 {- U  h
                               
登录/注册后可看大图

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

for k=1:N
& H. U7 G3 Y- O2 d4 E/ d    h(k)=hzero(k) + eta(k);! B8 s) {$ `9 w/ J7 S
    wet(k)=1;; T7 o5 M9 J2 K3 V& b" M) v: p" D
    if(h(k)<hmin)+ b' Z7 i$ g1 M% i* F% S
        wet(k)=0;0 ~7 c! q" A) T
    end) x- e4 A7 Z; E1 Q8 J4 L4 Q
    u(k)=un(k);end

版权声明

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

参考书目

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


* Z: P' k* S" {# U2 c

相关帖子

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