注: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