- !i is the direction of y, j is the direction of x.
- !the firt mesh point is origin of coordinate
- program barotropic
- implicit none
- real(8),parameter :: g=9.8,d=3.e5,dt=1.0,s=0.5
- integer,parameter :: mi=16,mj=20,mk=48
- 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)
- !----------------------------------------------- the value of z,u,v,ku,kv,kz at the time dt/2 is z1,u1,v1,ku1,kv1,kz1
- 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)
- integer i,j,k
- !----------------------------------------------read the geopotential height field
- open(1,file='data.txt')
- read(1,*)((z0(i,j),j=1,mj),i=1,mi)
- close(1)
- call mf(d,rm,f,mi,mj) !calculate m,f
- forall(i=1:mi,j=1:mj) z0(i,j)=z0(i,j)*10
- !-------------------------------------------------smooth the geopotential filed
- do i=2,mi-1
- do j=2,mj-1
- 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))
- enddo
- enddo
- !-------------------------------------------------calculate the initial value of u,v,z
- do i=2,mi-1
- do j=2,mj-1
- z(i,j,0)=z0(i,j)
- u(i,j,0)=-rm(i,j)*g/f(i,j)*(z0(i-1,j)-z0(i+1,j))/2/d
- v(i,j,0)=rm(i,j)*g/f(i,j)*(z0(i,j+1)-z0(i,j-1))/2/d
- enddo
- enddo
- !-------------------------------------------------calculate the boundary value of u,v,z at the points on the direction of y
- do k=0,mk
- do i=2,mi-1
- z(i,1,k)=z0(i,1)
- z(i,mj,k)=z0(i,mj)
- u(i,1,k)=-rm(i,1)*g/f(i,1)*(z0(i-1,1)-z0(i+1,1))/2/d !central difference
- u(i,mj,k)=-rm(i,mj)*g/f(i,mj)*(z0(i-1,mj)-z0(i+1,mj))/2/d !central difference
- v(i,1,k)=rm(i,1)*g/f(i,1)*(z0(i,2)-z0(i,1))/d !forward difference
- v(i,mj,k)=rm(i,mj)*g/f(i,mj)*(z0(i,mj)-z0(i,mj-1))/d !backward difference
- enddo
- !-------------------------------------------------calculate the boundary value of u,v,z at the points on the direction of x
- do j=2,mj-1
- z(1,j,k)=z0(1,j)
- z(mi,j,k)=z0(mi,j)
- u(1,j,k)=-rm(1,j)*g/f(1,j)*(z0(1,j)-z0(2,j))/d !backward difference
- u(mi,j,k)=-rm(mi,j)*g/f(mi,j)*(z0(mi-1,j)-z0(mi,j))/d !forward difference
- v(1,j,k)=rm(1,j)*g/f(1,j)*(z0(1,j+1)-z0(1,j-1))/2/d !central difference
- v(mi,j,k)=rm(mi,j)*g/f(mi,j)*(z0(mi,j+1)-z0(mi,j-1))/2/d !central difference
- enddo
- !-------------------------------------------------calculate the boundary value of u,v,z at the points on the four corners
- z(1,1,k)=z0(1,1)
- z(1,mj,k)=z0(1,mj)
- z(mi,1,k)=z0(mi,1)
- z(mi,mj,k)=z0(mi,mj)
- ! u(1,1,k)=0.5*(u(2,1,k)+u(1,2,k))
- ! u(1,mj,k)=0.5*(u(2,mj,k)+u(1,mj-1,k))
- ! u(mi,1,k)=0.5*(u(mi-1,1,k)+u(mi,2,k))
- ! u(mi,mj,k)=0.5*(u(mi-1,mj,k)+u(mi,mj-1,k))
- ! v(1,1,k)=0.5*(v(2,1,k)+v(1,2,k))
- ! v(1,mj,k)=0.5*(v(2,mj,k)+v(1,mj-1,k))
- ! v(mi,1,k)=0.5*(v(mi-1,1,k)+v(mi,2,k))
- ! v(mi,mj,k)=0.5*(v(mi-1,mj,k)+v(mi,mj-1,k))
- u(1,1,k)=-rm(1,1)*g/f(1,1)*(z0(1,1)-z0(2,1))/d !backward difference
- u(1,mj,k)=-rm(1,mj)*g/f(1,mj)*(z0(1,mj)-z0(2,mj))/d !backward difference
- u(mi,1,k)=-rm(mi,1)*g/f(mi,1)*(z0(mi-1,1)-z0(mi,1))/d !forward difference
- u(mi,mj,k)=-rm(mi,mj)*g/f(mi,mj)*(z0(mi-1,mj)-z0(mi,mj))/d !forward difference
- v(1,1,k)=rm(1,1)*g/f(1,1)*(z0(1,2)-z0(1,1))/d !forward difference
- v(1,mj,k)=rm(1,mj)*g/f(1,mj)*(z0(1,mj)-z0(1,mj-1))/d !backward difference
- v(mi,1,k)=rm(mi,1)*g/f(mi,1)*(z0(mi,2)-z0(mi,1))/d !forward difference
- v(mi,mj,k)=rm(mi,mj)*g/f(mi,mj)*(z0(mi,mj)-z0(mi,mj-1))/d !backward difference
- enddo
- !-------------------------------------------------------forward difference and central difference ,the step is half-step
- k=0
- call time_qiancha(u,v,z,u1,v1,z1,rm,f,k,mi,mj,mk)
- call time_zhongyangcha_one(u,v,z,u1,v1,z1,rm,f,k,mi,mj,mk)
- !------------------------------------------------------central difference, the step is one-step
- do k=1,47
- call time_zhongyangcha(u,v,z,rm,f,k,mi,mj,mk)
- if(mod(k+1,12)==0)then !temporal smoothing once every 12 hours
- do i=2,mi-1 !temporal smoothing
- do j=2,mj-1
- 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))
- 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))
- 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))
- enddo
- enddo
- do i=2,mi-1 !spatial smoothing
- do j=2,mj-1
- 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))
- 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))
- 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))
- enddo
- enddo
- endif
- enddo
- open(2,file='result.txt')
- open(3,file='10.txt')
- open(4,file='mf.txt')
- do k=0,mk
- write(2,100)k,'the value of z'
- do i=1,mi
- write(2,200)(z(i,j,k),j=1,mj)
- enddo
- write(2,100)k,'the value of u'
- do i=1,mi
- write(2,200)(u(i,j,k),j=1,mj)
- enddo
- write(2,100)k,'the value of v'
- do i=1,mi
- write(2,200)(v(i,j,k),j=1,mj)
- enddo
-
- write(3,200)(u(7,j,k),j=1,mj)
- enddo
- write(4,*)'the value of m'
- write(4,200)((rm(i,j),j=1,mj),i=1,mi)
- write(4,*)'the value of f'
- write(4,200)((f(i,j),j=1,mj),i=1,mi)
- close(2)
- close(3)
- close(4)
- 100 format(i4,1x,a)
- 200 format(<mj>f12.6)
- end
- ! ----------------------------------------------------------------define the subroutines
- subroutine time_qiancha(u,v,z,u1,v1,z1,rm,f,k,mi,mj,mk)
- real(8),parameter :: g=9.8,d=3.e5,dt=1.0,s=0.5
- 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)
- integer k
- call space(u,v,z,rm,f,k,ku,kv,kz,mi,mj,mk)
- do i=2,mi-1
- do j=2,mj-1
- u1(i,j)=u(i,j,k)+dt/2*ku(i,j,k)
- v1(i,j)=v(i,j,k)+dt/2*kv(i,j,k)
- z1(i,j)=z(i,j,k)+dt/2*kz(i,j,k)
- enddo
- enddo
- end subroutine
- !-----------------------------------------------------
- subroutine time_zhongyangcha_one(u,v,z,u1,v1,z1,rm,f,k,mi,mj,mk)
- real(8),parameter :: g=9.8,d=3.e5,dt=1.0,s=0.5
- 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)
- integer k
- call space_one(u1,v1,z1,ku1,kv1,kz1,rm,f,k,mi,mj)
- do i=2,mi-1
- do j=2,mj-1
- u(i,j,k+1)=u(i,j,k)+dt*ku1(i,j)
- v(i,j,k+1)=v(i,j,k)+dt*kv1(i,j)
- z(i,j,k+1)=z(i,j,k)+dt*kz1(i,j)
- enddo
- enddo
- end subroutine
- !-------------------------------------------------------
- subroutine time_zhongyangcha(u,v,z,rm,f,k,mi,mj,mk)
- real(8),parameter :: g=9.8,d=3.e5,dt=1.0,s=0.5
- 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)
- integer k
- call space(u,v,z,rm,f,k,ku,kv,kz,mi,mj,mk)
- do i=2,mi-1
- do j=2,mj-1
- u(i,j,k+1)=u(i,j,k-1)+dt*ku(i,j,k)
- v(i,j,k+1)=v(i,j,k-1)+dt*kv(i,j,k)
- z(i,j,k+1)=z(i,j,k-1)+dt*kz(i,j,k)
- enddo
- enddo
- end subroutine
- !----------------------------------------------------- the rate of change to u,v and z respectively is ku,kv and kz
- subroutine space(u,v,z,rm,f,k,ku,kv,kz,mi,mj,mk)
- real(8),parameter :: g=9.8,d=3.e5,dt=1.0,s=0.5
- 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
- integer k
- do i=2,mi-1
- do j=2,mj-1
- 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) )
- 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)
- 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)
- 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)) ) )
- ! write(*,*)ku(i,j,k)
- enddo
- enddo
- end subroutine
- !----------------------------------------------------
- subroutine space_one(u1,v1,z1,ku1,kv1,kz1,rm,f,k,mi,mj)
- real(8),parameter :: g=9.8,d=3.e5,dt=1.0,s=0.5
- 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
- integer k
- do i=2,mi-1
- do j=2,mj-1
- 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) )
- 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) )
- 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)) ) )
- ! write(*,*)kz1(i,j)
- enddo
- enddo
- end subroutine
- !---------------------------------------------------calculate m,f
- subroutine mf(d,rm,f,mi,mj)
- real(8),parameter :: pi=3.1415926535,omiga=7.292115e-5,a=6.371004e6,ak=0.7156,le=11142370
- real(8) ll(mi,mj),rm(mi,mj),l0,fai0,sita(mi,mj),fai(mi,mj),f(mi,mj),d
- !real(8) weidu(mi,mj),theta(mi,mj)
- fai0=60*pi/180
- l0=a*sin(pi/6)/ak
- do i=1,mi
- do j=1,mj
- ll(i,j)=(((j-1)*d)**2+(l0+(i-1)*d)**2)**0.5
- sita(i,j)=2*atan((ll(i,j)/l0)**(1/ak)*tan(0.5*pi/6))
- rm(i,j)=ak*ll(i,j)/(a*sin(sita(i,j)))
- fai(i,j)=fai0-(i-1)*d/a
- f(i,j)=2*omiga*sin(fai(i,j))
- ! ll(i,j)=(-4+j-1)**2+(9+i)**2
- ! ll(i,j)=sqrt(ll(i,j))*d
- ! weidu(i,j)=(le**(2/ak)-ll(i,j)**(2/ak))/(le**(2/ak)+ll(i,j)**(2/ak))
- !
- ! weidu(i,j)=asind(weidu(i,j))
- ! theta(i,j)=90.0-weidu(i,j)
- ! rm(i,j)=ak*ll(i,j)/(a*sind(theta(i,j)))
- ! f(i,j) =2.0*omiga*cosd(theta(i,j))
- ! write(*,*)rm(i,5)
- enddo
- enddo
- ! open(10,file='rm.txt')
- ! do i=1,mi
- ! write(10,300)(rm(i,j),j=1,mj)
- ! enddo
- ! 300 format(20f8.4)
- end subroutine
复制代码 |