Fotran 气象笔记

注:2012-2016年抄,已不用fotran,停止更新

Fortran 求春季高度距平场

program Height_spring

!----------------------------------------------------------

integer :: nx=144,ny=73,mon=12,yr=68

integer i,j,iz,it,t  !it:yr循环变量,iz:mon循环变量

real,allocatable :: hgt850(:,:,:,:),hgt500(:,:,:,:),hgt200(:,:,:,:)

real,allocatable :: spring_850ave(:,:),spring_500ave(:,:),spring_200ave(:,:)

real,allocatable :: spring_850ano(:,:,:),spring_500ano(:,:,:),spring_200ano(:,:,:)

allocate (hgt850(nx,ny,mon,yr),spring_850ave(nx,ny),spring_850ano(nx,ny,64))

allocate (hgt500(nx,ny,mon,yr),spring_500ave(nx,ny),spring_500ano(nx,ny,64))

allocate (hgt200(nx,ny,mon,yr),spring_200ave(nx,ny),spring_200ano(nx,ny,64))

!----------------------------------------------------------

open(1,file='hgt850.grd',form='binary')

do it=1,yr

do iz=1,mon

do j=1,ny

read(1)(hgt850(i,j,iz,it),i=1,nx)

enddo;enddo;enddo

!print*,hgt850

!pause

open(2,file='hgt500.grd',form='binary')

do it=1,yr

do iz=1,mon

do j=1,ny

read(2)(hgt500(i,j,iz,it),i=1,nx)

enddo;enddo;enddo

open(3,file='hgt200.grd',form='binary')

do it=1,yr

do iz=1,mon

do j=1,ny

read(3)(hgt200(i,j,iz,it),i=1,nx)

enddo;enddo;enddo

!----------------------------------------------------------

!                        850hPa

!----------------------------------------------------------

!---求平均场-----------------------------------------------

!----------------------------------------------------------

do it=4,67 !1951-2014

do iz=3,5  !春

do j=1,ny

do i=1,nx

if (hgt850(i,j,iz,it)/=-9.96921e+36) then

spring_850ave(i,j)=spring_850ave(i,j)+hgt850(i,j,iz,it)/(64*3)

else 

spring_850ave(i,j)=-9.96921e+36

end if

enddo;enddo;enddo;enddo

!---求距平场-----------------------------------------------

!----------------------------------------------------------

do it=4,67 !1951-2014

do iz=3,5

t=it-3

do j=1,ny

do i=1,nx

if (hgt850(i,j,iz,it)/=-9.96921e+36) then

spring_850ano(i,j,t)=spring_850ano(i,j,t)+hgt850(i,j,iz,it)/3

else 

spring_850ano(i,j,t)=-9.96921e+36

end if

enddo;enddo;enddo;enddo

do t=1,64 !1951-2014

do j=1,ny

do i=1,nx

if (spring_850ano(i,j,t)/=-9.96921e+36 .and. spring_850ave(i,j)/=-9.96921e+36) then

spring_850ano(i,j,t)=spring_850ano(i,j,t)-spring_850ave(i,j)

else

spring_850ano(i,j,t)=-9.96921e+36

end if

enddo;enddo;enddo

!----------------------------------------------------------

open(11,file='D:\biye\output\850\hgt_spring_850ave.grd',form='binary')

do j=1,ny

write(11)(spring_850ave(i,j),i=1,nx)

enddo

open(12,file='D:\biye\output\850\hgt_spring_850ano.grd',form='binary')

do it=1,64

do j=1,ny

write(12)(spring_850ano(i,j,it),i=1,nx)

enddo;enddo

!open(13,file='D:\biye\output\850\spring_850ave.txt')

!do j=1,ny

!write(13,*)(spring_850ave(i,j),i=1,nx)

!enddo

!open(14,file='D:\biye\output\850\spring_850ano.txt')

!do it=1,64

!do j=1,ny

!write(14,*)(spring_850ano(i,j,it),i=1,nx)

!enddo;enddo

!----------------------------------------------------------

!                        500hPa

!----------------------------------------------------------

!---求平均场-----------------------------------------------

!----------------------------------------------------------

do it=4,67 !1951-2014

do iz=3,5  !春

do j=1,ny

do i=1,nx

if (hgt500(i,j,iz,it)/=-9.96921e+36) then

spring_500ave(i,j)=spring_500ave(i,j)+hgt500(i,j,iz,it)/(64*3)

else 

spring_500ave(i,j)=-9.96921e+36

end if

enddo;enddo;enddo;enddo

!---求距平场-----------------------------------------------

!----------------------------------------------------------

do it=4,67 !1951-2014

do iz=3,5

t=it-3

do j=1,ny

do i=1,nx

if (hgt500(i,j,iz,it)/=-9.96921e+36) then

spring_500ano(i,j,t)=spring_500ano(i,j,t)+hgt500(i,j,iz,it)/3

else 

spring_500ano(i,j,t)=-9.96921e+36

end if

enddo;enddo;enddo;enddo

do t=1,64 !1951-2014

do j=1,ny

do i=1,nx

if (spring_500ano(i,j,t)/=-9.96921e+36 .and. spring_500ave(i,j)/=-9.96921e+36) then

spring_500ano(i,j,t)=spring_500ano(i,j,t)-spring_500ave(i,j)

else

spring_500ano(i,j,t)=-9.96921e+36

end if

enddo;enddo;enddo

!----------------------------------------------------------

open(21,file='D:\biye\output\500\hgt_spring_500ave.grd',form='binary')

do j=1,ny

write(21)(spring_500ave(i,j),i=1,nx)

enddo

open(22,file='D:\biye\output\500\hgt_spring_500ano.grd',form='binary')

do it=1,64

do j=1,ny

write(22)(spring_500ano(i,j,it),i=1,nx)

enddo;enddo

!----------------------------------------------------------

!                        200hPa

!----------------------------------------------------------

!---求平均场-----------------------------------------------

!----------------------------------------------------------

do it=4,67 !1951-2014

do iz=3,5  !春

do j=1,ny

do i=1,nx

if (hgt200(i,j,iz,it)/=-9.96921e+36) then

spring_200ave(i,j)=spring_200ave(i,j)+hgt200(i,j,iz,it)/(64*3)

else 

spring_200ave(i,j)=-9.96921e+36

end if

enddo;enddo;enddo;enddo

!---求距平场-----------------------------------------------

!----------------------------------------------------------

do it=4,67 !1951-2014

do iz=3,5

t=it-3

do j=1,ny

do i=1,nx

if (hgt200(i,j,iz,it)/=-9.96921e+36) then

spring_200ano(i,j,t)=spring_200ano(i,j,t)+hgt200(i,j,iz,it)/3

else 

spring_200ano(i,j,t)=-9.96921e+36

end if

enddo;enddo;enddo;enddo

do t=1,64 !1951-2014

do j=1,ny

do i=1,nx

if (spring_200ano(i,j,t)/=-9.96921e+36 .and. spring_200ave(i,j)/=-9.96921e+36) then

spring_200ano(i,j,t)=spring_200ano(i,j,t)-spring_200ave(i,j)

else

spring_200ano(i,j,t)=-9.96921e+36

end if

enddo;enddo;enddo

!----------------------------------------------------------

open(31,file='D:\biye\output\200\hgt_spring_200ave.grd',form='binary')

do j=1,ny

write(31)(spring_200ave(i,j),i=1,nx)

enddo

open(32,file='D:\biye\output\200\hgt_spring_200ano.grd',form='binary')

do it=1,64

do j=1,ny

write(32)(spring_200ano(i,j,it),i=1,nx)

enddo;enddo

!----------------------------------------------------------

!----------------------------------------------------------

end

Fortran 160站(160个)数据转化成二进制grb文件

program ueddcu
real lat(160),lon(160),rrSIM(160)
 character*8 id(160)	


open(1,file='lat_lon.txt')
	do i=1,160
	read(1,*)lat(i),lon(i)
	enddo

	open(2,file='Autumn_Composite_3.4_below-1.txt')        !只修改文件名

read(2,*)(rrsim(i),i=1,160)

!------调试看数据用-------------
do i=1,160	
	print*,rrsim(i)
end do
!-------------------------------

open(8,file='rrSIM.grb',form='binary')

!ccccccccccccccccccc写站点数据

	do j=1,160
	id(j)=char(j)
	tim=0.0
	nlev=1
	nflag=1
	write(8)id(j),lat(j),lon(j),tim,nlev,nflag,rrsim(j)
	enddo
	tim=0.0
	nlev=0
	nflag=1
	write(8)id(j-1),lat(j-1),lon(j-1),tim,nlev,nflag


	end

Fortran 将160站降水格点数据写成station yr mon rain的形式/计算春、夏、秋、冬降水距平

!将160站降水格点数据写成station yr mon rain的形式
program mine
implicit none
!将160站降水格点数据写成station yr mon rain的形式
! mon=1  rain1(station,yr)160站 , 951~2015:65年 , 一月份降水 共160*65=10400个数据
!------------------------------------------------------------------------------------------------
!存成rain1(station,yr)数组---------------------
integer rain1(1:160,1951:2015)
integer i,j,station,yr
integer r(520,20),r2(10400)
open(1,file='12.txt',status='old')   ![要处理几月的改几月的]
!原始文件存储方式为520行,20列-----------------
read(1,*) ((r(i,j),j=1,20),i=1,520)
close(1)
!转存为一维的----------------------------------
do i=1,520
  do j=1,20
  r2((i-1)*20+j)=r(i,j)
  end do
end do
!存成rain1(station,yr)数组---------------------
do yr=1951,2015
  do station=1,160
  rain1(station,yr)=r2((yr-1951)*160+station)
  end do
end do
!------------------------------------------------------------------------------------------------
!------------------------------------------------------------------------------------------------
!写成station yr mon rain的形式

open(13,file="rain12.txt",status='new') ![要处理几月的改几月的]
  do yr=1951,2015
    do station=1,160
    write(13,*) station,yr,12,rain1(station,yr) ![要处理几月的改几月的]
    enddo
  enddo
close(13)
!------------------------------------------------------------------------------------------------
end

接着用上面的计算春、夏、秋、冬降水距平
program exc4  
implicit none
!----------------------------------------------------------------------------------------------
!spring:3\4\5,summer:6\7\8,autumn:9\10\11,winter:12\1\2
!--------------------------------
!160站 春夏秋冬各个季节,65年[1951-2014 ,2015冬季无数据] 月平均,ave_rain160_season(1:160) 
real ave_rain160_spring(1:160),ave_rain160_summer(1:160),ave_rain160_autumn(1:160),ave_rain160_winter(1:160)
!--------------------------------
!160站 春夏秋冬各个季节 1951-2014 降水月距平:rain160_Anom_seasonal(station,yr)
real rain160_Anom_spring(1:160,1951:2014),rain160_Anom_summer(1:160,1951:2014),rain160_Anom_autumn(1:160,1951:2014),rain160_Anom_winter(1:160,1951:2014)



!----------------------------------------------------------------------------------------------
!把数据储存成:rain160(station,yr,mon)的形式-----------------------------------
!----------------------------------------------------------------------------------------------
integer rain160(1:160,1951:2015,1:12)
integer station,yr,mon
open(1,file='rain160.txt',status='old')  
!原始文件存储方式为124800行,4列-----------
read(1,*)!跳过文字说明行
10 read(1,*,end=100) station,yr,mon,rain160(station,yr,mon)
!print*,station,yr,mon,rain160(station,yr,mon)
!pause 
goto 10
100 continue
close(1)
!-----------------------------------------------------------------
! 调试检验数据:" 157        2015          12          47"
!print*,rain160(157,2015,12)
! 调试检验数据:" 46        1951           1          17"
!print*,rain160(46,1951,1)
!-----------------------------------------------------------------



!----------------------------------------------------------------------------------------------
!求1951-2014 [2015冬季无数据] 160站 春夏秋冬各个季节"降水距平百分率”,rain160_season(1:160,1951:2015)
!----------------------------------------------------------------------------------------------
!spring:3\4\5,summer:6\7\8,autumn:9\10\11,winter:12\1\2
!先求 160站 春夏秋冬各个季节,65年[1951-2014 ,2015冬季无数据] 平均,ave_rain160_season(1:160) 
!--------------------------------
do station=1,160 
ave_rain160_spring(station)=0.0 ![春]
  do yr=1951,2014
    do mon=3,5 !
    ave_rain160_spring(station)=ave_rain160_spring(station)+rain160(station,yr,mon)!先64年累加
    end do
  end do
ave_rain160_spring(station)=ave_rain160_spring(station)/(64*3) !再除以(64年*3月),才为季节月平均
end do

do station=1,160 
ave_rain160_summer(station)=0.0 ![夏]
  do yr=1951,2014
    do mon=6,8 !
    ave_rain160_summer(station)=ave_rain160_summer(station)+rain160(station,yr,mon)!先64年累加
    end do
  end do
ave_rain160_summer(station)=ave_rain160_summer(station)/(64*3) !再除以(64年*3月),才为季节平均
end do

do station=1,160 
ave_rain160_autumn(station)=0.0 ![秋]
  do yr=1951,2014
    do mon=9,11 !
    ave_rain160_autumn(station)=ave_rain160_autumn(station)+rain160(station,yr,mon)!先64年累加
    end do
  end do
ave_rain160_autumn(station)=ave_rain160_autumn(station)/(64*3) !再除以(64年*3月),才为季节平均
end do
!--------------------------------
!再求 160站 春夏秋冬各个季节 1951-2014 降水月距平:rain160_Anom_seasonal(station,yr)
do station=1,160 ![春]
  do yr=1951,2014
  rain160_Anom_spring(station,yr)=((rain160(station,yr,3)+rain160(station,yr,4)+rain160(station,yr,5))/3-ave_rain160_spring(station))
  end do
end do

do station=1,160 ![夏]
  do yr=1951,2014
  rain160_Anom_summer(station,yr)=((rain160(station,yr,6)+rain160(station,yr,7)+rain160(station,yr,8))/3-ave_rain160_summer(station))
  end do
end do

do station=1,160 ![秋]
  do yr=1951,2014
  rain160_Anom_autumn(station,yr)=((rain160(station,yr,9)+rain160(station,yr,10)+rain160(station,yr,11))/3-ave_rain160_autumn(station))
  end do
end do
!--------------------------------
![特殊]冬季 1951-2014 160站 降水月距平
!先求平均
do station=1,160 
ave_rain160_winter(station)=0.0 ![冬]
  do yr=1951,2014 
    ave_rain160_winter(station)=ave_rain160_winter(station)+rain160(station,yr,12)+rain160(station,yr+1,1)+rain160(station,yr+1,2)
  end do
ave_rain160_winter(station)=ave_rain160_winter(station)/(64*3) !再除以(64年*3月),才为季节平均
end do

!再求降水月距平
do station=1,160 ![冬]
  do yr=1951,2014
  rain160_Anom_winter(station,yr)=(rain160(station,yr,12)+rain160(station,yr+1,1)+rain160(station,yr+1,2))/3-ave_rain160_winter(station)
  end do
end do
!----------------------------------------------------------------------------------------------
!----------------------------------------------------------------------------------------------


!----------------------------------------------------------------------------------------------
!结果写成:行为yr,列为station 的矩阵
!160站 春夏秋冬各个季节 1951-2014 降水月距平:rain160_Anom_seasonal(station,yr)
200 format(2x,160f13.7)
!--------------------------------
open(11,file="1951-2014_rain160_Anom_spring.txt",status='new') ![春]
write(11,*) "1951-2014_160站 春季降水月距平[数据共有:64行:(1951-2014年),160列:(1-160站)]"
write(11,200) ((rain160_Anom_spring(station,yr),station=1,160),yr=1951,2014)
close(11)

open(22,file="1951-2014_rain160_Anom_summer.txt",status='new') ![夏]
write(22,*) "1951-2014_160站 夏季降水月距平[数据共有:64行:(1951-2014年),160列:(1-160站)]"
write(22,200) ((rain160_Anom_summer(station,yr),station=1,160),yr=1951,2014)
close(22)

open(33,file="1951-2014_rain160_Anom_autumn.txt",status='new') ![秋]
write(33,*) "1951-2014_160站 秋季降水月距平[数据共有:64行:(1951-2014年),160列:(1-160站)]"
write(33,200) ((rain160_Anom_autumn(station,yr),station=1,160),yr=1951,2014)
close(33)

open(44,file="1951-2014_rain160_Anom_winter.txt",status='new') ![冬]
write(44,*) "1951-2014_160站 冬季降水月距平[数据共有:64行:(1951-2014年),160列:(1-160站)]"
write(44,200) ((rain160_Anom_winter(station,yr),station=1,160),yr=1951,2014)
close(44)





!--------------------------------
!调试输出位数选择
!do station=1,160
!print*,rain160_Anom_summer(station,2008)
!print '(f13.7)',rain160_Anom_summer(station,2008)
!end do
!--------------------------------




!wirte(20,"(I4,<t>(f8.3)") yr,(y(j),j=1,t)
!--------------------------------
!read(1,*)((mm(i,j),j=1,7),i=1,4)


!----------------------------------------------------------------------------------------------
!----------------------------------------------------------------------------------------------
end
!------------------------------------------------------------------------------------------------

Fortran 计算160站点夏季降水与nino3区冬季海温11年滑动相关系数

!计算160站点夏季降水与nino3区冬季海温11年滑动相关系数
 program main
 parameter(m=160,n=57,a=11)
 real sstave(n),preave(m,n),r(m,n-a+1)
 real xmean,ymean,sx,sy,sxy
 integer i,j,k

 !读取降水与海温数据
 open(11,file='d:/test/rain.grd',form='binary')
 do i=1,m
  do j=1,n
   read(11) preave(i,j)
  end do
 end do

 open(12,file='d:/test/nino_win_ave.txt')
  do j=1,n
   read(12,*) sstave(j)
  end do
  close(11)
  close(12)
!求滑动相关系数
do i=1,m
 do j=1,n-a+1  
  xmean=0.0
  ymean=0.0
  sx=0.0
  sy=0.0
  sxy=0.0

  do k=1,a
   xmean=xmean+preave(i,k+j-1)/a
   ymean=ymean+sstave(k+j-1)/a
  end do

 
  do k=1,a
   sxy=sxy+(preave(i,k+j-1)-xmean)*(sstave(k+j-1)-ymean)
   sx=sx+(preave(i,k+j-1)-xmean)*(preave(i,k+j-1)-xmean)
   sy=sy+(sstave(k+j-1)-ymean)*(sstave(k+j-1)-ymean)
  
  end do 
  r(i,j)=sxy/sqrt(sx*sy)
 end do
end do
!将滑动相关系数写入txt文件
open(13,file='d:/test/pre_sst_cor.txt')
 do i=1,m
  do j=1,n-a+1
  write(13,*) r(i,j)
  end do
 end do
 
stop 
end

猜你喜欢

转载自blog.csdn.net/weixin_40645816/article/details/82110427