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

  • 相关阅读:
    安装python官方的mysql库“mysql-connector-python”
    ubuntu(Mint-17)修改dns
    Updating Protobuf and GRPC in Golang
    git切换到远程分支
    ubuntu下取代ping的好工具tcpping
    为什么利率上升,债券价格下降?
    关于债券之我的疑惑
    GitHub超详细图文攻略
    git——从远程库克隆
    git——添加远程库
  • 原文地址:https://www.cnblogs.com/pangblog/p/3265339.html
Copyright © 2020-2023  润新知