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

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

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

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

% o2 [' Z" q& Y* S) P' |8 r
                               
登录/注册后可看大图

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

) R" g+ [$ H( N$ v
                               
登录/注册后可看大图

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

; z4 z& d* J# R/ ~+ C
                               
登录/注册后可看大图
. b- A" b+ h) P) s6 N( b7 m/ @
                               
登录/注册后可看大图
总是相差半个网格距离。在二维的情况,速度是
0 Q( T0 |; |# R; ^3 Z" `8 f) |9 V
                               
登录/注册后可看大图

3 X+ D% f' |8 E( E6 O                               
登录/注册后可看大图
两个变量,因此我们需要考虑速度

  H7 Y6 o) t4 l2 l) t7 y  L                               
登录/注册后可看大图

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


  `% v* ]$ J! v                               
登录/注册后可看大图

% t" T/ C& N  d1 z                               
登录/注册后可看大图
的导数,因此为了让对

; y) }2 \, o' M! j% J% D: c                               
登录/注册后可看大图
的中央差分落在和
) ?6 Q4 Q& b" e8 q$ ^$ Q% T
                               
登录/注册后可看大图
同样的位置上,
, W' F  j4 t3 B0 ^6 W$ ]+ h
                               
登录/注册后可看大图
也需要和

; Y7 F* v2 b5 h                               
登录/注册后可看大图
间隔半个网格距。这就是大名鼎鼎的Arakawa C网格。在使用交错网格的时候,我们要明确一个准则,就是要确保计算时各个变量都要在相同的空间位置上。比如要算
8 t# t7 S5 P2 f8 z/ g1 f0 o+ {, e
                               
登录/注册后可看大图
在t+1时刻的值,就需要
0 K9 O6 f( v- y+ D% j
                               
登录/注册后可看大图
两侧的

, I  Y. O  ~3 K! D7 J/ V( [                               
登录/注册后可看大图
做中央差分,这样确保等号左边的

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


5 }2 P7 X* k8 G4 ~% l' X7 M3 J2 Y# K# @


$ a1 r( P' [3 G7 v! G                               
登录/注册后可看大图

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


  y# `, k/ ^# B/ I, Z                               
登录/注册后可看大图
是水平方向的流速,而东边界(图中右边)的
  u9 H: v* |$ o' g, k. k
                               
登录/注册后可看大图
是在陆地边界上,所以要使

0 K' m  ]* k, n2 J" w                               
登录/注册后可看大图
时变为0,不能让水质点穿出边界,而
5 E* @1 S+ ~9 m2 R/ U) D
                               
登录/注册后可看大图
或者

" d" F2 X4 R- Q  c; W7 k$ C                               
登录/注册后可看大图
时则不需要给予约束,这样就不用考虑西边界,因为西边界没有
4 J1 v+ y' B# y! \, F8 M- `, O3 L1 p
                               
登录/注册后可看大图
的格点。对北边界的

) R) t1 ?9 M  k' R$ z' l                               
登录/注册后可看大图
处理方式一样,在此不做赘述。

# e/ L) _9 D- ^9 a


. `  A7 t6 }1 f1 O8 Q                               
登录/注册后可看大图

un(j,k)=0;uu=u(j,k);duu=du(j,k);if(wet(j,k)==1)
6 A- o9 O* e% D2 R$ w9 r    if((wet(j,k+1)==1)||(duu>0))
* h5 f) W- w0 D# M9 G        un(j,k)=uu+duu;
* N$ n% ^- m0 j4 ^& s5 A6 Z    endelse5 q' [3 a# ~" T, f
    if((wet(j,k+1)==1)&&(duu<0))# ^+ d6 W2 [7 Y7 e' ^
        un(j,k)=uu+duu;
( @7 F( }  |6 Q% Z) ~& l9 m    endend

  对


  D  V; B( I6 H  g- G" ]9 d+ y" X                               
登录/注册后可看大图
求解的代码实现过程如上,其中if就是在判断边界和速度方向,把不在边界和在边界但是

0 C+ Y6 L2 o- e: q, E                               
登录/注册后可看大图
不大于0的值赋计算结果,使得在边界且大于0的点赋为0。

7 C6 B) J7 |- w% Z  a2 S5 e                               
登录/注册后可看大图
的计算和

" p8 \" I% v5 I; \                               
登录/注册后可看大图

的计算同理。


* }6 O8 K' P2 V

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

2 \( m5 E, q: I$ }* l! {
                               
登录/注册后可看大图

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

- R( g! u6 ^3 S" ?& u! ]1 D6 T# u2 _
                               
登录/注册后可看大图

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

. `' ~! x" ], v0 }  h: L
                               
登录/注册后可看大图

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


& m5 Z; j; i/ m: j. L( s/ |' W* ]/ m                               
登录/注册后可看大图

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

9 w  b3 h+ q: H% _2 S
                               
登录/注册后可看大图

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


7 l& R# |5 y, K7 n" J                               
登录/注册后可看大图


5 r9 W& g, m  m3 X" {9 t                               
登录/注册后可看大图

,具体表达式如下。

4 p' o. S: i; Z$ p8 m

. |$ c) m0 f2 R1 D& N% e
                               
登录/注册后可看大图

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


( `: q) y( w% D                               
登录/注册后可看大图
5 Y1 q8 N1 e4 ?/ @
                               
登录/注册后可看大图
这种变量。这就是前文已经提到的那个问题,Arakawa C网格的
1 r( ]* \; I7 T0 ^0 H8 M. K
                               
登录/注册后可看大图

0 S& I2 l" x# D2 ~$ T! {                               
登录/注册后可看大图
在网格的不同位置处,但是做运算只能在相同网格处。因此
$ D) c1 w  ~# ^
                               
登录/注册后可看大图

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

5 z+ I1 g# l( \- ^: G' _- ?
                               
登录/注册后可看大图
,而
; u) x" X- C. B2 j- I
                               
登录/注册后可看大图
的意思是u网格所在位置的速度

/ k" q% D1 z9 b$ V3 l7 U                               
登录/注册后可看大图
。以

" T( Q- @) Q7 \! N& q) h5 u                               
登录/注册后可看大图
为例,如下图所示,可由周围的四个
1 `) c- U8 ~7 E# R
                               
登录/注册后可看大图
平均求得。

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


% c7 ~  p+ K& P, I, ]7 F                               
登录/注册后可看大图

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

0 {  y4 y0 V0 T9 b: {3 h5 W" V
                               
登录/注册后可看大图

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

for k=1:N, t  M& m! @! c
    h(k)=hzero(k) + eta(k);: @5 u& _2 A2 s. G9 }: y
    wet(k)=1;5 B1 U# J: O, Y  j7 F9 y0 ~5 p
    if(h(k)<hmin)
) ]3 }4 \' w: l        wet(k)=0;7 k: }" L  W) a; Q
    end
  }8 q" m: K( a* c; E* t    u(k)=un(k);end

版权声明

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

参考书目

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


  V% f8 [5 y* W8 K; R7 c) O* |0 T
回复

举报 使用道具

相关帖子

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