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

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

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

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

0 A: A8 n' \2 c+ G; x5 ^4 |
                               
登录/注册后可看大图

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

) M& V8 Q3 A2 C
                               
登录/注册后可看大图

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


& L* a" J) o) ^, R/ \! ~                               
登录/注册后可看大图

2 X4 `' c5 M6 s# _8 B) Q0 A                               
登录/注册后可看大图
总是相差半个网格距离。在二维的情况,速度是
8 a- S! z% A* ]* s: P  V+ t
                               
登录/注册后可看大图

% c- R: {% T$ F$ S* o                               
登录/注册后可看大图
两个变量,因此我们需要考虑速度
! S& [) d# `5 B- @% W) Y' P
                               
登录/注册后可看大图

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

/ ^" s0 C0 _' n( o  g
                               
登录/注册后可看大图

3 b: j9 Z7 E- H4 O8 s                               
登录/注册后可看大图
的导数,因此为了让对
+ {7 R2 W" L. P; B4 E
                               
登录/注册后可看大图
的中央差分落在和

$ t+ h5 u6 r& w$ B( r" H                               
登录/注册后可看大图
同样的位置上,

. b$ Z8 C/ N6 }: w5 s0 ]" l. q                               
登录/注册后可看大图
也需要和

# A; V" }" F4 g) v                               
登录/注册后可看大图
间隔半个网格距。这就是大名鼎鼎的Arakawa C网格。在使用交错网格的时候,我们要明确一个准则,就是要确保计算时各个变量都要在相同的空间位置上。比如要算
( j# q) U+ H0 L
                               
登录/注册后可看大图
在t+1时刻的值,就需要

! g) s* ]' `- o" z* c: G                               
登录/注册后可看大图
两侧的
! p! }" N  n4 U' U' `
                               
登录/注册后可看大图
做中央差分,这样确保等号左边的
+ Q1 t' m5 c: M# b0 o: g* F
                               
登录/注册后可看大图
和等号右边的导数是相同的空间位置。这一点在之后讲解更复杂的模式中会体现的更明显。例如POM模式,会有更多的参变量,为了保证处于同一空间位置上需要做平均运算。而本文的后半部分,在考虑底摩擦的浅水方程中也涉及到了。


, B* U) H9 f& p7 [$ t8 q% y


$ n( c& G9 j, A                               
登录/注册后可看大图

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

5 W/ o3 q! L5 }7 D  E
                               
登录/注册后可看大图
是水平方向的流速,而东边界(图中右边)的

5 W9 e. v2 y9 B* Z$ A# C0 f3 x2 U+ t                               
登录/注册后可看大图
是在陆地边界上,所以要使

" @' L  v1 `" A( f1 m( A                               
登录/注册后可看大图
时变为0,不能让水质点穿出边界,而

% n- H' Q' S/ j* o& V                               
登录/注册后可看大图
或者
. u/ `! A- t4 f7 Q& m% u9 |
                               
登录/注册后可看大图
时则不需要给予约束,这样就不用考虑西边界,因为西边界没有

+ D* U: h- W1 {8 Y                               
登录/注册后可看大图
的格点。对北边界的

, ^' l: D2 [' ]# ?* V7 A4 ^( C                               
登录/注册后可看大图
处理方式一样,在此不做赘述。


0 c$ K2 v: R0 c9 b( U0 N


9 c/ ?0 r6 s" q9 \; A1 m/ L0 |                               
登录/注册后可看大图

un(j,k)=0;uu=u(j,k);duu=du(j,k);if(wet(j,k)==1)0 ]' x% D$ ^& x
    if((wet(j,k+1)==1)||(duu>0))1 k- ^; i4 o, h" L2 t! X  j5 z
        un(j,k)=uu+duu;1 s; g+ g. S' [* V
    endelse
& B+ _* Q+ @% W% m4 y    if((wet(j,k+1)==1)&&(duu<0)); s# \# k5 {+ b
        un(j,k)=uu+duu;+ ~# \, I' V$ A/ l- Y. j$ `  W
    endend

  对

( {$ L: L7 V4 a1 m0 ]: J# i+ f
                               
登录/注册后可看大图
求解的代码实现过程如上,其中if就是在判断边界和速度方向,把不在边界和在边界但是

+ x; J7 z' E; m                               
登录/注册后可看大图
不大于0的值赋计算结果,使得在边界且大于0的点赋为0。
  g8 F! _, `8 s. _9 B+ |
                               
登录/注册后可看大图
的计算和
/ E! r0 k9 V! T
                               
登录/注册后可看大图

的计算同理。


- O# e; t, M# f: d2 q

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

2 ?0 P9 F3 V  V( L  {' K4 W- l8 m
                               
登录/注册后可看大图

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


, Q1 V  ]5 X/ u! R  A/ @                               
登录/注册后可看大图

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

4 E: ^+ K- I, N
                               
登录/注册后可看大图

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

& V" F! h! V1 I
                               
登录/注册后可看大图

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


; l& {$ T$ E. Y2 O# b- P                               
登录/注册后可看大图

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

* S& I+ N0 S3 p1 v
                               
登录/注册后可看大图


& W2 w% y( [8 v4 \' H) ?; Q                               
登录/注册后可看大图

,具体表达式如下。


" c* U! _# ~; U/ }! \5 L7 {. o" _


- x7 t$ W# V9 ]1 S$ \$ m4 @, a                               
登录/注册后可看大图

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


# `+ f, j* C: I6 E9 H5 O6 R                               
登录/注册后可看大图
/ U7 y. |4 q8 B! B6 H! }
                               
登录/注册后可看大图
这种变量。这就是前文已经提到的那个问题,Arakawa C网格的

) w7 |- \" Z& l, c3 I) ]                               
登录/注册后可看大图

- m( c' \* L" x9 [' F6 y                               
登录/注册后可看大图
在网格的不同位置处,但是做运算只能在相同网格处。因此

  D9 h2 d2 `+ R/ q' L% h                               
登录/注册后可看大图

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


8 c$ ?' V( e- z( U+ W                               
登录/注册后可看大图
,而

2 N9 O* S1 E1 r8 R4 m) Q                               
登录/注册后可看大图
的意思是u网格所在位置的速度
/ P5 M3 G# r+ U9 o; m: z
                               
登录/注册后可看大图
。以
, J; k* K9 K* D1 }" j" h! B' c2 ?
                               
登录/注册后可看大图
为例,如下图所示,可由周围的四个
+ c) t! j: b  S4 P' C/ K
                               
登录/注册后可看大图
平均求得。

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


0 t9 m; H! R( Q% s                               
登录/注册后可看大图

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

0 {) R* F* e% ~0 T0 F) i# h0 Y
                               
登录/注册后可看大图

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

for k=1:N
( C4 m$ Y0 n, X0 O/ c    h(k)=hzero(k) + eta(k);
1 Q5 `7 ]. W' b3 ?    wet(k)=1;$ v' D( h' q% Z7 i$ a. d
    if(h(k)<hmin)3 o1 j% t4 g) E% ?2 y9 O3 M
        wet(k)=0;
' C: j+ j, L3 n3 a    end5 M. r! _& L9 F
    u(k)=un(k);end

版权声明

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

参考书目

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


6 v. n# ?5 |( m; x0 S
回复

举报 使用道具

相关帖子

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