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

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

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

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

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

, D( Z4 l5 f8 M) m6 K' u
                               
登录/注册后可看大图

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

  ^5 T: W! q, I
                               
登录/注册后可看大图

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

0 N3 @6 v2 _& s' ~9 z  k  w( U; S
                               
登录/注册后可看大图

  v1 @- J" M' K: N- k4 G/ b6 n                               
登录/注册后可看大图
总是相差半个网格距离。在二维的情况,速度是
, I) j7 X1 u& O4 N: m# c/ G
                               
登录/注册后可看大图

% ?0 E/ S1 F% J3 O! @* l                               
登录/注册后可看大图
两个变量,因此我们需要考虑速度
7 ^! F. V* e  O
                               
登录/注册后可看大图

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


' B% i: H/ d$ R5 d, ^                               
登录/注册后可看大图
9 q& Y! S9 \& R3 `
                               
登录/注册后可看大图
的导数,因此为了让对

" v; D* F# U. o2 p$ o                               
登录/注册后可看大图
的中央差分落在和

) p% E) I' H9 }' P) j* ?5 g' ?                               
登录/注册后可看大图
同样的位置上,
; v1 Y9 `' r# H5 w
                               
登录/注册后可看大图
也需要和

1 H& I/ h0 r$ ?! t7 e4 t, d                               
登录/注册后可看大图
间隔半个网格距。这就是大名鼎鼎的Arakawa C网格。在使用交错网格的时候,我们要明确一个准则,就是要确保计算时各个变量都要在相同的空间位置上。比如要算
- o" a1 x( N9 q6 J& S# }! u
                               
登录/注册后可看大图
在t+1时刻的值,就需要
- Y# G; ]' o6 I' Y7 n4 ^
                               
登录/注册后可看大图
两侧的

# g8 d! A+ S, P# b2 \+ S                               
登录/注册后可看大图
做中央差分,这样确保等号左边的

9 E" |4 |9 a0 Y3 _$ f% b5 z  i                               
登录/注册后可看大图
和等号右边的导数是相同的空间位置。这一点在之后讲解更复杂的模式中会体现的更明显。例如POM模式,会有更多的参变量,为了保证处于同一空间位置上需要做平均运算。而本文的后半部分,在考虑底摩擦的浅水方程中也涉及到了。


, o" u/ }0 c% Y& w


' S- i, E, j6 N                               
登录/注册后可看大图

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

  L$ F, \: N" Z! D
                               
登录/注册后可看大图
是水平方向的流速,而东边界(图中右边)的

- T- ?5 u, ]2 \  V6 f# c                               
登录/注册后可看大图
是在陆地边界上,所以要使
- C8 z1 P+ L8 P5 e! c; b) e1 U  R
                               
登录/注册后可看大图
时变为0,不能让水质点穿出边界,而

' r5 @! K; B$ }( `                               
登录/注册后可看大图
或者
$ z& \. e0 y% m8 O5 x6 V
                               
登录/注册后可看大图
时则不需要给予约束,这样就不用考虑西边界,因为西边界没有

' R# u( s9 n1 D6 D; U                               
登录/注册后可看大图
的格点。对北边界的
, ^* n/ B5 |4 @9 ]
                               
登录/注册后可看大图
处理方式一样,在此不做赘述。

; `" W+ k2 o2 c0 Q6 a) S4 w" Z

- u1 O& W, e: f: `$ K; \
                               
登录/注册后可看大图

un(j,k)=0;uu=u(j,k);duu=du(j,k);if(wet(j,k)==1)9 R% h7 J) o% u/ J; v8 Q) l
    if((wet(j,k+1)==1)||(duu>0))( s  X3 W  {& n5 X9 j  q
        un(j,k)=uu+duu;, b, y4 C; t& u( o: D) H' f" b; B
    endelse
3 S* ~. P1 V. z, `2 g    if((wet(j,k+1)==1)&&(duu<0)): x# M2 e/ e' J1 k# \
        un(j,k)=uu+duu;0 Q- b! K! j2 v& h5 S
    endend

  对

# `# j" M/ ^: Q
                               
登录/注册后可看大图
求解的代码实现过程如上,其中if就是在判断边界和速度方向,把不在边界和在边界但是
; \, k+ |8 ?1 |2 i. X+ b
                               
登录/注册后可看大图
不大于0的值赋计算结果,使得在边界且大于0的点赋为0。

3 X6 G) [! M/ j$ W5 }                               
登录/注册后可看大图
的计算和

# o. g1 c: K& o. V3 c* u                               
登录/注册后可看大图

的计算同理。

+ v) d9 j5 M4 O

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

- n# |: K# O4 Z6 ^* x
                               
登录/注册后可看大图

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

2 H/ ?  \8 R7 ?7 c$ ?& H
                               
登录/注册后可看大图

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

9 {- P; O6 S0 ]8 r
                               
登录/注册后可看大图

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

# u) I9 [; k5 Q' g) G
                               
登录/注册后可看大图

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


3 R& j* n' y6 R3 l2 L5 x                               
登录/注册后可看大图

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


6 z! N8 `: x, Q7 ~: I  o$ E                               
登录/注册后可看大图


: U# v- G1 a- I+ v9 C                               
登录/注册后可看大图

,具体表达式如下。

- {2 w- R- c  J" ]0 a6 }' h5 f( |

1 S" S# }1 i, X! a! O4 ]+ G
                               
登录/注册后可看大图

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


& |4 ]' E, r5 S* y0 M3 W                               
登录/注册后可看大图
7 K. s3 r' J- N
                               
登录/注册后可看大图
这种变量。这就是前文已经提到的那个问题,Arakawa C网格的
' B  \3 J; }5 g0 h7 P% x! h
                               
登录/注册后可看大图
! i/ w' u3 _4 L- [4 Z: Q# N( P
                               
登录/注册后可看大图
在网格的不同位置处,但是做运算只能在相同网格处。因此

# C( Z. X+ B3 v5 ?( Y! d# s4 b3 m                               
登录/注册后可看大图

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

3 a, t5 J8 ~  a" E
                               
登录/注册后可看大图
,而

- B  d% [( {$ K                               
登录/注册后可看大图
的意思是u网格所在位置的速度
3 I6 f( l( _2 o' v+ O3 G* {
                               
登录/注册后可看大图
。以

" L  {# ^0 K) Q/ B3 G% W! X2 x                               
登录/注册后可看大图
为例,如下图所示,可由周围的四个
+ a. p  z3 m' W( r
                               
登录/注册后可看大图
平均求得。

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

7 \# `8 F! K$ H8 O- @2 r  i
                               
登录/注册后可看大图

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


2 i/ `0 U7 ]) j5 y5 o                               
登录/注册后可看大图

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

for k=1:N
7 O/ Y" K8 Y% y  U    h(k)=hzero(k) + eta(k);# c3 y; v/ R1 ^/ N2 {
    wet(k)=1;/ q3 P$ B7 C* |  {1 J0 L2 w
    if(h(k)<hmin)
. e9 V  x. q+ p: X& R" H1 \* F, C        wet(k)=0;
' }4 L! Q; u# G3 r- h- X6 ?8 {    end: y0 {9 z  I0 e
    u(k)=un(k);end

版权声明

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

参考书目

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


) l, e( E* L( R7 ]5 z; U0 X
回复

举报 使用道具

相关帖子

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