使用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
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