爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4310|回复: 6

[求助] 使用Fortran处理ARWpost后处理二进制数据

[复制链接]
发表于 2016-8-31 15:55:40 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
       最近想利用Fortran读取ARWpost后处理二进制数据 .dat文件,但是一直无法成功,程序没有报错,只是读出来的数据明显不对。以下是我的程序以及相关的ctl文件,还有试验读出来的xlat数据情况,希望有做过相关研究的前辈给一些思路,已经十多天了依然无法解决。
program main
implicit none
integer i,j,k
integer,parameter::nx=119
integer,parameter::ny=119
integer,parameter::nz=77
real:: zh(nx,ny,nz),p(nx,ny,nz),tc(nx,ny,nz),qv(nx,ny,nz),theta(nx,ny,nz),u(nx,ny,nz),v(nx,ny,nz),w(nx,ny,nz),td(nx,ny,nz),rh(nx,ny,nz)
real:: hgt(nx,ny,1),slvl(nx,ny,1),sst(nx,ny,1),tsk(nx,ny,1),xland(nx,ny,1),xlat(nx,ny,1),xlong(nx,ny,1),q2(nx,ny,1),t2(nx,ny,1),u10(nx,ny,1),v10(nx,ny,1),hfx(nx,ny,1),qfx(nx,ny,1)
real :: undef=1.0e30
integer:: irec
integer:: itime,ivars
integer:: tdef=37
irec=1
open(10,file='0526exam.dat',form='UNFORMATTED',access='DIRECT',status='OLD',recl=nx*ny)
do itime=1,37
  write(*,*) itime
  do ivars=1,23
     write(*,*) ivars
         if(ivars==1)  then  !  XLAT, Latitude
       read(10,rec=irec) ((xlat(i,j,1),i=1,nx),j=1,ny)
    irec=irec+1
          do i=1,nx
     do j=1,ny
      write(*,*) xlat(i,j,1)
     end do
    end do
     else if(ivars==2)  then  !  XLONG, Lontitude
       read(10,rec=irec) ((xlong(i,j,1),i=1,nx),j=1,ny)
          irec=irec+1
  else if(ivars==3)  then  !  x-wind component (m s-1)
   do k=1,nz
       read(10,rec=irec) ((u(i,j,k),i=1,nx),j=1,ny)
    irec=irec+1
   end do
         else if(ivars==4)  then  !  y-wind component (m s-1)
   do k=1,nz
          read(10,rec=irec) ((v(i,j,k),i=1,nx),j=1,ny)
    irec=irec+1
   end do
        else if(ivars==5)  then  !  z-wind component (m s-1)
   do k=1,nz
          read(10,rec=irec) ((w(i,j,k),i=1,nx),j=1,ny)
    irec=irec+1
   end do
        else if(ivars==6)  then  !  QV at 2 M (kg kg-1)
    read(10,rec=irec) ((q2(i,j,1),i=1,nx),j=1,ny)
    irec=irec+1
  else if(ivars==7)  then  !  TEMP at 2 M (K)
    read(10,rec=irec) ((t2(i,j,1),i=1,nx),j=1,ny)
          irec=irec+1
        else if(ivars==8)  then  !  U at 10 M (m s-1)
    read(10,rec=irec) ((u10(i,j,1),i=1,nx),j=1,ny)
          irec=irec+1
  else if(ivars==9)  then  !  V at 10 M (m s-1)
    read(10,rec=irec) ((v10(i,j,1),i=1,nx),j=1,ny)
          irec=irec+1
        else if(ivars==10) then  !  Water vapor mixing ratio (kg kg-1)
    do k=1,nz
     read(10,rec=irec) ((qv(i,j,k),i=1,nx),j=1,ny)
     irec=irec+1
          end do
        else if(ivars==11) then  !  Terrain Height (m)
     read(10,rec=irec) ((HGT(i,j,1),i=1,nx),j=1,ny)
           irec=irec+1
        else if(ivars==12) then  !  SURFACE SKIN TEMPERATURE (K)
     read(10,rec=irec) ((tsk(i,j,1),i=1,nx),j=1,ny)
     irec=irec+1
        else if(ivars==13) then  !  LAND MASK (1 FOR LAND, 2 FOR WATER) (-)
     read(10,rec=irec) ((xland(i,j,1),i=1,nx),j=1,ny)
     irec=irec+1
        else if(ivars==14) then  !  UPWARD HEAT FLUX AT THE SURFACE (W m-2)
     read(10,rec=irec) ((hfx(i,j,1),i=1,nx),j=1,ny)
     irec=irec+1
        else if(ivars==15) then  !  UPWARD MOISTURE FLUX AT THE SURFACE (kg m-2 s-1)
     read(10,rec=irec) ((qfx(i,j,1),i=1,nx),j=1,ny)
           irec=irec+1
        else if(ivars==16) then  !  SEA SURFACE TEMPERATURE (K)
           read(10,rec=irec) ((sst(i,j,1),i=1,nx),j=1,ny)
     irec=irec+1
        else if(ivars==17) then  !  Model pressure (hPa)
    do k=1,nz
     read(10,rec=irec) ((p(i,j,k),i=1,nx),j=1,ny)
           irec=irec+1
    end do
        else if(ivars==18) then  !  Model height (km)
    do k=1,nz
     read(10,rec=irec) ((zh(i,j,k),i=1,nx),j=1,ny)
           irec=irec+1
    end do
        else if(ivars==19) then  !  Temperature (C)
    do k=1,nz
     read(10,rec=irec) ((tc(i,j,k),i=1,nx),j=1,ny)
           irec=irec+1
    end do
        else if(ivars==20) then  !  Potential Temperature (K)
          do k=1,nz
     read(10,rec=irec) ((theta(i,j,k),i=1,nx),j=1,ny)
           irec=irec+1
    end do
        else if(ivars==21) then  !  Dewpoint Temperature (C)
          do k=1,nz
     read(10,rec=irec) ((td(i,j,k),i=1,nx),j=1,ny)
           irec=irec+1
    end do
        else if(ivars==22) then  !  Relative Humidity (%)
          do k=1,nz
     read(10,rec=irec) ((rh(i,j,k),i=1,nx),j=1,ny)
           irec=irec+1
    end do
        else if(ivars==23) then  !  Sea Levelp Pressure (hPa)
          read(10,rec=irec) ((slvl(i,j,1),i=1,nx),j=1,ny)
          irec=irec+1
   end if

  end do !ivars
end do !itime
        
end program main



这是ctl文件
dset F:\exam\0526ex\0526exam.dat
options  byteswapped
undef 1.e30
title  OUTPUT FROM WRF V3.8 MODEL
pdef  119 119 lcc  35.000  160.000   60.000   60.000  50.00000  20.00000  160.00000  10000.000  10000.000
xdef  338 linear  152.36604   0.04504504
ydef  267 linear   28.89213   0.04504504
zdef   77 levels  
   0.01000
   0.03000
   0.05000
   0.07000
   0.09000
   0.11000
   0.13000
   0.15000
   0.17000
   0.19000
   0.21000
   0.23000
   0.25000
   0.27000
   0.29000
   0.31000
   0.33000
   0.35000
   0.37000
   0.39000
   0.41000
   0.43000
   0.45000
   0.47000
   0.49000
   0.51000
   0.53000
   0.55000
   0.57000
   0.59000
   0.61000
   0.63000
   0.65000
   0.67000
   0.69000
   0.71000
   0.73000
   0.75000
   0.77000
   0.79000
   0.81000
   0.83000
   0.85000
   0.87000
   0.89000
   0.91000
   0.93000
   0.95000
   0.97000
   0.99000
   1.01000
   1.05000
   1.10000
   1.15000
   1.20000
   1.25000
   1.30000
   1.40000
   1.50000
   1.60000
   1.70000
   1.80000
   1.90000
   2.00000
   2.20000
   2.40000
   2.60000
   2.80000
   3.00000
   3.50000
   4.00000
   5.00000
   6.00000
   7.00000
   8.00000
   9.00000
  10.00000
tdef   37 linear 06Z26MAY2016      60MN      
VARS   23
XLAT           1  0  LATITUDE, SOUTH IS NEGATIVE (degree_north)
XLONG          1  0  LONGITUDE, WEST IS NEGATIVE (degree_east)
U             77  0  x-wind component (m s-1)
V             77  0  y-wind component (m s-1)
W             77  0  z-wind component (m s-1)
Q2             1  0  QV at 2 M (kg kg-1)
T2             1  0  TEMP at 2 M (K)
U10            1  0  U at 10 M (m s-1)
V10            1  0  V at 10 M (m s-1)
QVAPOR        77  0  Water vapor mixing ratio (kg kg-1)
HGT            1  0  Terrain Height (m)
TSK            1  0  SURFACE SKIN TEMPERATURE (K)
XLAND          1  0  LAND MASK (1 FOR LAND, 2 FOR WATER) (-)
HFX            1  0  UPWARD HEAT FLUX AT THE SURFACE (W m-2)
QFX            1  0  UPWARD MOISTURE FLUX AT THE SURFACE (kg m-2 s-1)
SST            1  0  SEA SURFACE TEMPERATURE (K)
pressure      77  0  Model pressure (hPa)
height        77  0  Model height (km)
tc            77  0  Temperature (C)
theta         77  0  Potential Temperature (K)
td            77  0  Dewpoint Temperature (C)
rh            77  0  Relative Humidity (%)
slp            1  0  Sea Levelp Pressure (hPa)
ENDVARS
屏幕截图(237).png
密码修改失败请联系微信:mofangbao
发表于 2016-12-14 17:55:42 | 显示全部楼层
您好!您的问题解决了吗?我也遇到同样的问题,把读入的数据输出对比了一下,明显不对,读的乱七八糟的。
密码修改失败请联系微信:mofangbao
发表于 2016-12-14 19:06:56 | 显示全部楼层
哈利路亚 发表于 2016-12-14 17:55
您好!您的问题解决了吗?我也遇到同样的问题,把读入的数据输出对比了一下,明显不对,读的乱七八糟的。

http://bbs.06climate.com/forum.php?mod=viewthread&tid=49173  看看这个帖子,也许有点帮助
密码修改失败请联系微信:mofangbao
发表于 2017-3-9 16:59:51 | 显示全部楼层
楼主你的问题解决了吗??
密码修改失败请联系微信:mofangbao
发表于 2017-3-10 10:26:21 | 显示全部楼层
open(10,file='0526exam.dat',form='UNFORMATTED',access='DIRECT',status='OLD',recl=nx*ny)改为
open(10,file='0526exam.dat',form='UNFORMATTED',access='DIRECT',status='OLD',recl=nx*ny,convert='big_endian') 试试
密码修改失败请联系微信:mofangbao
发表于 2017-3-10 11:01:34 | 显示全部楼层
楼主你有些变量有77层数据,为什么每次irec都只是加1呢?
密码修改失败请联系微信:mofangbao
发表于 2018-5-7 06:01:51 | 显示全部楼层
请问楼主的问题解决了吗,也正在做差不多的工作,很苦恼
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表