爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4149|回复: 6

[源代码] 正压原始方程组(浅水波方程)fortran源代码

[复制链接]
发表于 2016-9-13 16:10:25 | 显示全部楼层 |阅读模式
购买主题 已有 3 人购买  本主题需向作者支付 5 贡献 才能浏览
密码修改失败请联系微信:mofangbao
发表于 2016-9-13 16:47:31 | 显示全部楼层
  1. !i is the direction of y, j is the direction of x.
  2. !the firt mesh point is origin of coordinate
  3. program barotropic
  4. implicit none
  5. real(8),parameter :: g=9.8,d=3.e5,dt=1.0,s=0.5
  6. integer,parameter :: mi=16,mj=20,mk=48
  7. real(8) z0(mi,mj),z(mi,mj,0:mk),u(mi,mj,0:mk),v(mi,mj,0:mk),rm(mi,mj),f(mi,mj)
  8. !----------------------------------------------- the value of z,u,v,ku,kv,kz at the time dt/2 is z1,u1,v1,ku1,kv1,kz1
  9. real(8) z1(mi,mj),u1(mi,mj),v1(mi,mj),kz(mi,mj,0:mk),ku(mi,mj,0:mk),kv(mi,mj,0:mk),kz1(mi,mj),ku1(mi,mj),kv1(mi,mj)
  10. integer i,j,k
  11. !----------------------------------------------read the geopotential height field
  12. open(1,file='data.txt')
  13. read(1,*)((z0(i,j),j=1,mj),i=1,mi)
  14. close(1)

  15. call mf(d,rm,f,mi,mj) !calculate m,f
  16. forall(i=1:mi,j=1:mj) z0(i,j)=z0(i,j)*10
  17. !-------------------------------------------------smooth the geopotential filed
  18. do i=2,mi-1
  19.   do j=2,mj-1
  20.     z0(i,j)=z0(i,j)+s/4*(z0(i+1,j)+z0(i-1,j)+z0(i,j+1)+z0(i,j-1)-4*z0(i,j))
  21.   enddo
  22. enddo
  23. !-------------------------------------------------calculate the initial value of u,v,z
  24. do i=2,mi-1
  25.   do j=2,mj-1
  26.     z(i,j,0)=z0(i,j)
  27.         u(i,j,0)=-rm(i,j)*g/f(i,j)*(z0(i-1,j)-z0(i+1,j))/2/d
  28.     v(i,j,0)=rm(i,j)*g/f(i,j)*(z0(i,j+1)-z0(i,j-1))/2/d
  29.   enddo
  30. enddo
  31. !-------------------------------------------------calculate the boundary value of u,v,z at the points on the direction of y

  32. do k=0,mk
  33.   do i=2,mi-1
  34.      z(i,1,k)=z0(i,1)
  35.      z(i,mj,k)=z0(i,mj)
  36.      u(i,1,k)=-rm(i,1)*g/f(i,1)*(z0(i-1,1)-z0(i+1,1))/2/d      !central difference
  37.      u(i,mj,k)=-rm(i,mj)*g/f(i,mj)*(z0(i-1,mj)-z0(i+1,mj))/2/d !central difference
  38.      v(i,1,k)=rm(i,1)*g/f(i,1)*(z0(i,2)-z0(i,1))/d             !forward difference
  39.      v(i,mj,k)=rm(i,mj)*g/f(i,mj)*(z0(i,mj)-z0(i,mj-1))/d      !backward difference
  40.   enddo
  41. !-------------------------------------------------calculate the boundary value of u,v,z at the points on the direction of x
  42.   do j=2,mj-1
  43.       z(1,j,k)=z0(1,j)
  44.       z(mi,j,k)=z0(mi,j)
  45.       u(1,j,k)=-rm(1,j)*g/f(1,j)*(z0(1,j)-z0(2,j))/d            !backward difference
  46.       u(mi,j,k)=-rm(mi,j)*g/f(mi,j)*(z0(mi-1,j)-z0(mi,j))/d     !forward difference
  47.       v(1,j,k)=rm(1,j)*g/f(1,j)*(z0(1,j+1)-z0(1,j-1))/2/d       !central difference
  48.       v(mi,j,k)=rm(mi,j)*g/f(mi,j)*(z0(mi,j+1)-z0(mi,j-1))/2/d  !central difference
  49.   enddo
  50. !-------------------------------------------------calculate the boundary value of u,v,z at the points on the four corners
  51.   z(1,1,k)=z0(1,1)
  52.   z(1,mj,k)=z0(1,mj)
  53.   z(mi,1,k)=z0(mi,1)
  54.   z(mi,mj,k)=z0(mi,mj)
  55. !   u(1,1,k)=0.5*(u(2,1,k)+u(1,2,k))
  56. !   u(1,mj,k)=0.5*(u(2,mj,k)+u(1,mj-1,k))
  57. !   u(mi,1,k)=0.5*(u(mi-1,1,k)+u(mi,2,k))
  58. !   u(mi,mj,k)=0.5*(u(mi-1,mj,k)+u(mi,mj-1,k))
  59. !   v(1,1,k)=0.5*(v(2,1,k)+v(1,2,k))
  60. !   v(1,mj,k)=0.5*(v(2,mj,k)+v(1,mj-1,k))
  61. !   v(mi,1,k)=0.5*(v(mi-1,1,k)+v(mi,2,k))
  62. !   v(mi,mj,k)=0.5*(v(mi-1,mj,k)+v(mi,mj-1,k))
  63.    u(1,1,k)=-rm(1,1)*g/f(1,1)*(z0(1,1)-z0(2,1))/d               !backward difference
  64.    u(1,mj,k)=-rm(1,mj)*g/f(1,mj)*(z0(1,mj)-z0(2,mj))/d          !backward difference
  65.    u(mi,1,k)=-rm(mi,1)*g/f(mi,1)*(z0(mi-1,1)-z0(mi,1))/d          !forward difference
  66.    u(mi,mj,k)=-rm(mi,mj)*g/f(mi,mj)*(z0(mi-1,mj)-z0(mi,mj))/d     !forward difference

  67.    v(1,1,k)=rm(1,1)*g/f(1,1)*(z0(1,2)-z0(1,1))/d                !forward difference
  68.    v(1,mj,k)=rm(1,mj)*g/f(1,mj)*(z0(1,mj)-z0(1,mj-1))/d           !backward difference
  69.    v(mi,1,k)=rm(mi,1)*g/f(mi,1)*(z0(mi,2)-z0(mi,1))/d           !forward difference
  70.    v(mi,mj,k)=rm(mi,mj)*g/f(mi,mj)*(z0(mi,mj)-z0(mi,mj-1))/d      !backward difference
  71. enddo
  72. !-------------------------------------------------------forward difference and central difference ,the step is half-step
  73. k=0
  74. call time_qiancha(u,v,z,u1,v1,z1,rm,f,k,mi,mj,mk)
  75. call time_zhongyangcha_one(u,v,z,u1,v1,z1,rm,f,k,mi,mj,mk)
  76. !------------------------------------------------------central difference, the step is one-step
  77. do k=1,47
  78.   call time_zhongyangcha(u,v,z,rm,f,k,mi,mj,mk)
  79.     if(mod(k+1,12)==0)then !temporal smoothing once every 12 hours
  80.       do i=2,mi-1 !temporal smoothing
  81.         do j=2,mj-1
  82.          u(i,j,k)=u(i,j,k)+s/2*(u(i,j,k+1)+u(i,j,k-1)-2*u(i,j,k))
  83.          v(i,j,k)=v(i,j,k)+s/2*(v(i,j,k+1)+v(i,j,k-1)-2*v(i,j,k))
  84.          z(i,j,k)=z(i,j,k)+s/2*(z(i,j,k+1)+z(i,j,k-1)-2*z(i,j,k))
  85.         enddo
  86.       enddo
  87.       do i=2,mi-1 !spatial smoothing
  88.         do j=2,mj-1
  89.          u(i,j,k)=u(i,j,k)+s/4*(u(i+1,j,k)+u(i-1,j,k)+u(i,j+1,k)+u(i,j-1,k)-4*u(i,j,k))
  90.          v(i,j,k)=v(i,j,k)+s/4*(v(i+1,j,k)+v(i-1,j,k)+v(i,j+1,k)+v(i,j-1,k)-4*v(i,j,k))
  91.          z(i,j,k)=z(i,j,k)+s/4*(z(i+1,j,k)+z(i-1,j,k)+z(i,j+1,k)+z(i,j-1,k)-4*z(i,j,k))
  92.         enddo
  93.       enddo
  94.     endif
  95. enddo

  96. open(2,file='result.txt')
  97. open(3,file='10.txt')
  98. open(4,file='mf.txt')
  99. do k=0,mk
  100.   write(2,100)k,'the value of z'
  101.     do i=1,mi
  102.       write(2,200)(z(i,j,k),j=1,mj)
  103.     enddo

  104.     write(2,100)k,'the value of u'

  105.     do i=1,mi
  106.       write(2,200)(u(i,j,k),j=1,mj)
  107.     enddo

  108.     write(2,100)k,'the value of v'

  109.     do i=1,mi
  110.       write(2,200)(v(i,j,k),j=1,mj)
  111.     enddo
  112.        
  113.         write(3,200)(u(7,j,k),j=1,mj)       
  114. enddo
  115.    write(4,*)'the value of m'
  116.    write(4,200)((rm(i,j),j=1,mj),i=1,mi)
  117.    write(4,*)'the value of f'
  118.    write(4,200)((f(i,j),j=1,mj),i=1,mi)
  119. close(2)
  120. close(3)
  121. close(4)
  122. 100 format(i4,1x,a)
  123. 200 format(<mj>f12.6)
  124. end
  125. ! ----------------------------------------------------------------define the subroutines
  126. subroutine time_qiancha(u,v,z,u1,v1,z1,rm,f,k,mi,mj,mk)
  127. real(8),parameter :: g=9.8,d=3.e5,dt=1.0,s=0.5
  128. real(8) z(mi,mj,0:mk),u(mi,mj,0:mk),v(mi,mj,0:mk),rm(mi,mj),f(mi,mj),kz(mi,mj,0:mk),ku(mi,mj,0:mk),kv(mi,mj,0:mk),z1(mi,mj),u1(mi,mj),v1(mi,mj)
  129. integer k
  130. call space(u,v,z,rm,f,k,ku,kv,kz,mi,mj,mk)
  131. do i=2,mi-1
  132.   do j=2,mj-1
  133.     u1(i,j)=u(i,j,k)+dt/2*ku(i,j,k)
  134.     v1(i,j)=v(i,j,k)+dt/2*kv(i,j,k)
  135.     z1(i,j)=z(i,j,k)+dt/2*kz(i,j,k)
  136.   enddo
  137. enddo
  138. end subroutine
  139. !-----------------------------------------------------
  140. subroutine time_zhongyangcha_one(u,v,z,u1,v1,z1,rm,f,k,mi,mj,mk)
  141. real(8),parameter :: g=9.8,d=3.e5,dt=1.0,s=0.5
  142. real(8) z(mi,mj,0:mk),u(mi,mj,0:mk),v(mi,mj,0:mk),z1(mi,mj),u1(mi,mj),v1(mi,mj),rm(mi,mj),f(mi,mj),kz1(mi,mj),ku1(mi,mj),kv1(mi,mj)
  143. integer k
  144. call space_one(u1,v1,z1,ku1,kv1,kz1,rm,f,k,mi,mj)
  145. do i=2,mi-1
  146.   do j=2,mj-1
  147.     u(i,j,k+1)=u(i,j,k)+dt*ku1(i,j)
  148.     v(i,j,k+1)=v(i,j,k)+dt*kv1(i,j)
  149.     z(i,j,k+1)=z(i,j,k)+dt*kz1(i,j)
  150.   enddo
  151. enddo
  152. end subroutine
  153. !-------------------------------------------------------
  154. subroutine time_zhongyangcha(u,v,z,rm,f,k,mi,mj,mk)
  155. real(8),parameter :: g=9.8,d=3.e5,dt=1.0,s=0.5
  156. real(8) z(mi,mj,0:mk),u(mi,mj,0:mk),v(mi,mj,0:mk),rm(mi,mj),f(mi,mj),kz(mi,mj,0:mk),ku(mi,mj,0:mk),kv(mi,mj,0:mk)
  157. integer k
  158. call space(u,v,z,rm,f,k,ku,kv,kz,mi,mj,mk)
  159. do i=2,mi-1
  160.   do j=2,mj-1
  161.     u(i,j,k+1)=u(i,j,k-1)+dt*ku(i,j,k)
  162.     v(i,j,k+1)=v(i,j,k-1)+dt*kv(i,j,k)
  163.     z(i,j,k+1)=z(i,j,k-1)+dt*kz(i,j,k)
  164.   enddo
  165. enddo
  166. end subroutine
  167. !----------------------------------------------------- the rate of change to u,v and z respectively is ku,kv and kz
  168. subroutine space(u,v,z,rm,f,k,ku,kv,kz,mi,mj,mk)
  169. real(8),parameter :: g=9.8,d=3.e5,dt=1.0,s=0.5
  170. real(8) z(mi,mj,0:mk),u(mi,mj,0:mk),v(mi,mj,0:mk),rm(mi,mj),f(mi,mj),kz(mi,mj,0:mk),ku(mi,mj,0:mk),kv(mi,mj,0:mk),f0
  171. integer k
  172. do i=2,mi-1
  173.   do j=2,mj-1
  174.     f0=f(i,j)+1.0/2/d*u(i,j,k)*( rm(i-1,j)-rm(i+1,j) )-1.0/2/d*v(i,j,k)*( rm(i,j+1)-rm(i,j-1) )
  175.     ku(i,j,k)=-rm(i,j)*( (1.0/4/d)*( ( u(i,j+1,k)+u(i,j,k) )*( u(i,j+1,k)-u(i,j,k) )+( u(i,j,k)+u(i,j-1,k) )*( u(i,j,k)-u(i,j-1,k) ) )+(1.0/4/d)*( ( v(i,j,k)+v(i+1,j,k) )*( u(i,j,k)-u(i+1,j,k) )+( v(i-1,j,k)+v(i,j,k) )*( u(i-1,j,k)-u(i,j,k) ) )+g/2/d*( z(i,j+1,k)-z(i,j-1,k) ) )+f0*v(i,j,k)
  176.     kv(i,j,k)=-rm(i,j)*( (1.0/4/d)*( ( u(i,j+1,k)+u(i,j,k) )*( v(i,j+1,k)-v(i,j,k) )+( u(i,j,k)+u(i,j-1,k) )*( v(i,j,k)-v(i,j-1,k) ) )+(1.0/4/d)*( ( v(i,j,k)+v(i+1,j,k) )*( v(i,j,k)-v(i+1,j,k) )+( v(i-1,j,k)+v(i,j,k) )*( v(i-1,j,k)-v(i,j,k) ) )+g/2/d*( z(i-1,j,k)-z(i+1,j,k) ) )-f0*u(i,j,k)
  177.     kz(i,j,k)=-rm(i,j)**2*( (1.0/4/d)*( (u(i,j+1,k)+u(i,j,k))*(z(i,j+1,k)/rm(i,j+1)-z(i,j,k)/rm(i,j))+(u(i,j,k)+u(i,j-1,k))*(z(i,j,k)/rm(i,j)-z(i,j-1,k)/rm(i,j-1)) )+(1.0/4/d)*( (v(i-1,j,k)+v(i,j,k))*(z(i-1,j,k)/rm(i-1,j)-z(i,j,k)/rm(i,j))+(v(i,j,k)+v(i+1,j,k))*(z(i,j,k)/rm(i,j)-z(i+1,j,k)/rm(i+1,j)) )+z(i,j,k)/rm(i,j)*( (1.0/2/d)*(u(i,j+1,k)-u(i,j-1,k))+(1.0/2/d)*(v(i-1,j,k)-v(i+1,j,k)) ) )
  178. !        write(*,*)ku(i,j,k)
  179.   enddo
  180. enddo
  181. end subroutine

  182. !----------------------------------------------------
  183. subroutine space_one(u1,v1,z1,ku1,kv1,kz1,rm,f,k,mi,mj)
  184. real(8),parameter :: g=9.8,d=3.e5,dt=1.0,s=0.5
  185. real(8) z1(mi,mj),u1(mi,mj),v1(mi,mj),rm(mi,mj),f(mi,mj),kz1(mi,mj),ku1(mi,mj),kv1(mi,mj),f0
  186. integer k
  187. do i=2,mi-1
  188.   do j=2,mj-1

  189.     ku1(i,j)=-rm(i,j)*( (1.0/4/d)*( ( u1(i,j+1)+u1(i,j) )*( u1(i,j+1)-u1(i,j) )+( u1(i,j)+u1(i,j-1) )*( u1(i,j)-u1(i,j-1) ) )+(1.0/4/d)*( ( v1(i,j)+v1(i+1,j) )*( u1(i-1,j)-u1(i,j) )+( v1(i-1,j)+v1(i,j) )*( u1(i,j)-u1(i+1,j) ) )+g/2/d*( z1(i,j+1)-z1(i,j-1) )+f(i,j)*v1(i,j)+u1(i,j)*(1.0/2/d)*( rm(i-1,j)-rm(i+1,j) )*v1(i,j)-v1(i,j)*(1.0/2/d)*( rm(i,j+1)-rm(i,j-1) )*v1(i,j) )
  190.         kv1(i,j)=-rm(i,j)*( (1.0/4/d)*( ( u1(i,j+1)+u1(i,j) )*( v1(i,j+1)-v1(i,j) )+( u1(i,j)+u1(i,j-1) )*( v1(i,j)-v1(i,j-1) ) )+(1.0/4/d)*( ( v1(i,j)+v1(i+1,j) )*( v1(i-1,j)-v1(i,j) )+( v1(i-1,j)+v1(i,j) )*( v1(i,j)-v1(i+1,j) ) )+g/2/d*( z1(i-1,j)-z1(i+1,j) )-f(i,j)*u1(i,j)-u1(i,j)*(1.0/2/d)*( rm(i-1,j)-rm(i+1,j) )*u1(i,j)+v1(i,j)*(1.0/2/d)*( rm(i,j+1)-rm(i,j-1) )*u1(i,j) )
  191.     kz1(i,j)=-rm(i,j)**2*( (1.0/4/d)*( (u1(i,j+1)+u1(i,j))*(z1(i,j+1)/rm(i,j+1)-z1(i,j)/rm(i,j))+(u1(i,j)+u1(i,j-1))*(z1(i,j)/rm(i,j)-z1(i,j-1)/rm(i,j-1)) )+(1.0/4/d)*( (v1(i-1,j)+v1(i,j))*(z1(i-1,j)/rm(i-1,j)-z1(i,j)/rm(i,j))+(v1(i,j)+v1(i+1,j))*(z1(i,j)/rm(i,j)-z1(i+1,j)/rm(i+1,j)) )+z1(i,j)/rm(i,j)*( (1.0/2/d)*(u1(i,j+1)-u1(i,j-1))+(1.0/2/d)*(v1(i-1,j)-v1(i+1,j)) ) )

  192. !  write(*,*)kz1(i,j)
  193.   enddo
  194. enddo
  195. end subroutine
  196. !---------------------------------------------------calculate m,f
  197. subroutine mf(d,rm,f,mi,mj)
  198. real(8),parameter :: pi=3.1415926535,omiga=7.292115e-5,a=6.371004e6,ak=0.7156,le=11142370
  199. real(8) ll(mi,mj),rm(mi,mj),l0,fai0,sita(mi,mj),fai(mi,mj),f(mi,mj),d
  200. !real(8) weidu(mi,mj),theta(mi,mj)
  201. fai0=60*pi/180
  202. l0=a*sin(pi/6)/ak
  203. do i=1,mi
  204.   do j=1,mj
  205.     ll(i,j)=(((j-1)*d)**2+(l0+(i-1)*d)**2)**0.5
  206.     sita(i,j)=2*atan((ll(i,j)/l0)**(1/ak)*tan(0.5*pi/6))
  207.     rm(i,j)=ak*ll(i,j)/(a*sin(sita(i,j)))
  208.     fai(i,j)=fai0-(i-1)*d/a
  209.     f(i,j)=2*omiga*sin(fai(i,j))
  210. !  ll(i,j)=(-4+j-1)**2+(9+i)**2
  211. !  ll(i,j)=sqrt(ll(i,j))*d
  212. !   weidu(i,j)=(le**(2/ak)-ll(i,j)**(2/ak))/(le**(2/ak)+ll(i,j)**(2/ak))
  213. !  
  214. ! weidu(i,j)=asind(weidu(i,j))
  215. ! theta(i,j)=90.0-weidu(i,j)
  216. ! rm(i,j)=ak*ll(i,j)/(a*sind(theta(i,j)))
  217. ! f(i,j) =2.0*omiga*cosd(theta(i,j))
  218. !        write(*,*)rm(i,5)
  219.   enddo
  220. enddo
  221. !  open(10,file='rm.txt')
  222. ! do i=1,mi
  223. ! write(10,300)(rm(i,j),j=1,mj)
  224. ! enddo
  225. ! 300 format(20f8.4)
  226. end subroutine
复制代码

评分

参与人数 1金钱 +10 收起 理由
林可 + 10 很给力!

查看全部评分

密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-13 16:45:54 | 显示全部楼层
把相应得测试数据也顺便传上来吧,五个贡献有点儿贵啊。
密码修改失败请联系微信:mofangbao
发表于 2016-9-13 21:58:13 | 显示全部楼层
赞!谢谢分享
密码修改失败请联系微信:mofangbao
发表于 2017-5-29 19:12:56 | 显示全部楼层
随便看看~
密码修改失败请联系微信:mofangbao
发表于 2017-6-19 14:17:07 | 显示全部楼层
谢谢,感谢分享~
密码修改失败请联系微信:mofangbao
发表于 2017-6-19 14:25:04 | 显示全部楼层
感谢楼主分享,楼主辛苦了
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表