使用gfortran将数据写成Grads格式的代码示例

使用gfortran将数据写成Grads格式的代码示例:

 

!-----'Fortran4Grads.f90'

program Fortran4Grads

implicit none

integer,parameter::xn=32  !-----经度(Longitude)网格数

integer,parameter::yn=18  !-----纬度(Latitude)网格数

integer,parameter::zn=7   !-----高度层数

integer,parameter::tn=5   !-----时间跨度20010101-20010105

integer,parameter::fileunit=8   !-----文件设备号

integer::x,y,z,v,t,irec       !-----定义整型变量



!-----定义多维数组,保存变量

real(kind=4) :: u(xn,yn,zn,tn)     !-----水平风速u

real(kind=4) :: w(xn,yn,zn,tn)     !-----垂直风速w

real(kind=4) :: h(xn,yn,zn,tn)     !-----相对湿度h

real(kind=4):: var                !-----辅助变量

!-----数组赋值

do t=1,tn

	do z=1,zn

		do y=1,yn

			do x=1,xn

				u(x,y,z,t) = 10.0*sin(1.0*x+1.0*y)+1.0*z   !-----水平风速u

				w(x,y,z,t) = 10.0*cos(1.0*x+1.0*y)+1.0*z   !-----垂直风速w

				h(x,y,z,t) = 1.0/real(t)+1.0/real(x)+1.0/real(y) !-----相对湿度h

			enddo

		enddo

	enddo

enddo

!-----将数据写入文件

open(fileunit,file='m.dat',form='unformatted',access='direct',recl=4)

!---在open语句中,gfortran编译real(kind=4)时,recl=4

irec = 1

do t=1,tn

	!-----保存水平风速u

	do z=1,zn

		do y=1,yn

			do x=1,xn

				write(fileunit,rec=irec) u(x,y,z,t)

                irec = irec + 1

			enddo

		enddo

	enddo

	!-----保存垂直风速w

	do z=1,zn

		do y=1,yn

			do x=1,xn

				write(fileunit,rec=irec) w(x,y,z,t)

				irec = irec + 1

			enddo

		enddo

	enddo

	!-----保存相对湿度h

	do z=1,zn

		do y=1,yn

			do x=1,xn

				write(fileunit,rec=irec) h(x,y,z,t)

				irec = irec + 1

			enddo

		enddo

	enddo

enddo

close(fileunit)

write(*,*)'irec=xn*yn*zn*3*tn=',irec

end program Fortran4Grads


在grads中描述文件为:

dset ^m.dat

title "Write Data for GrADS Using Fortran"

undef 1e+40

xdef 32 linear -160.000000 10.000000

ydef 18 linear -90.000000 10.000000

zdef 7 levels 1000 850 700 500 300 200 100

tdef 5 linear 0Z2jan2001  1dy

vars 3

u         7   99  Eastward wind [m/s]

w         7   99  vertical wind [m/s]

h         7   99  relative humidity [%]

endvars

上面的Fortran语句保存数据时如果采用隐式Do循环,效率会高很多:

 

!-----'Fortran4Grads1.f90'

program Fortran4Grads1

implicit none

integer,parameter::xn=32  !-----经度(Longitude)网格数

integer,parameter::yn=18  !-----纬度(Latitude)网格数

integer,parameter::zn=7   !-----高度层数

integer,parameter::tn=5   !-----时间跨度20010101-20010105

integer,parameter::fileunit=8   !-----文件设备号

integer::x,y,z,v,t,irec       !-----定义整型变量



!-----定义多维数组,保存变量

real(kind=4) :: u(xn,yn,zn,tn)     !-----水平风速u

real(kind=4) :: w(xn,yn,zn,tn)     !-----垂直风速w

real(kind=4) :: h(xn,yn,zn,tn)     !-----相对湿度h

real(kind=4):: var                !-----辅助变量

!-----数组赋值

do t=1,tn

	do z=1,zn

		do y=1,yn

			do x=1,xn

				u(x,y,z,t) = 10.0*sin(1.0*x+1.0*y)+1.0*z   !-----水平风速u

				w(x,y,z,t) = real(x+y+z)   !-----垂直风速w

				h(x,y,z,t) = 1.0/real(t)+1.0/real(x)+1.0/real(y) !-----相对湿度h

			enddo

		enddo

	enddo

enddo

!-----将数据写入文件Grads

open(fileunit,file='m.dat',form='unformatted',access='direct',recl=xn*yn*zn*4)

!---在open语句中,gfortran编译real(kind=4)时,recl=4

irec = 1

do t=1,tn

	!-----采用Do循环,保存水平风速u

	write(fileunit,rec=irec) (((u(x,y,z,t),x=1,xn),y=1,yn),z=1,zn)

    irec = irec + 1

	!-----采用Do循环,保存垂直风速w

	write(fileunit,rec=irec) (((w(x,y,z,t),x=1,xn),y=1,yn),z=1,zn)

    irec = irec + 1

	!-----采用Do循环,保存相对湿度h

	write(fileunit,rec=irec) (((h(x,y,z,t),x=1,xn),y=1,yn),z=1,zn)

    irec = irec + 1

enddo

close(fileunit)

write(*,*)'irec=3*tn=',irec

end program Fortran4Grads1


 

测试环境为centos X86-64,gcc 4.4.7

 

 

 

你可能感兴趣的:(fortran)