爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 4892|回复: 10

[求助] fortran 读取nc文件后,数据不对,不知道错误出在哪里,求助!

[复制链接]

新浪微博达人勋

发表于 2013-12-19 11:03:26 | 显示全部楼层 |阅读模式

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

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

x
nc数据文件为,hgt.1950.nc
程序:
  program read_netcdf

      include 'netcdf.inc'
        integer i,j,k,l,irec

      integer*4  ncid, status    ! file control
!-------------------------------------------------------------

      real*4      :: lon(144)
      real*4      :: lat(73),level(17)
      integer*4   :: time(365)
      real*4      :: hgt(144,73,17,365)
!-------------------------------------------------------------
      integer*4   :: start(10)
      integer*4   :: count(10)
      integer     :: dimids(5)! allow up to 10 dimensions
      integer     :: dimid, xtype
      character(len = 31) :: dummy

!   Open netCDF file.
      status = nf_open('hgt.1950.nc', nf_nowrite, ncid)
      if ( status /= nf_noerr) call handle_err(status)

!----------------------------------------------------

      status=nf_inq_varid(ncid, 'lon', lonid)
          if (status /= nf_noerr) call handle_err(status)

      status = nf_inq_var(ncid, lonid, dummy, xtype, ndim, dimids, natts)
      if (status /= nf_noerr) call handle_err(status)

     do j = 1, ndim
        status = nf_inq_dim(ncid, dimids(j), dummy, len)
        if (status /= nf_noerr) call handle_err(status)
        start(j) = 1
            count(j) = len
      enddo

      status = nf_get_vara_real(ncid, lonid, start, count, lon)

!----------------------------------------------------
!   Retrieve data for Variable 'lat'
!print*,ncid
      status=nf_inq_varid(ncid, 'lat', latid)
          if (status /= nf_noerr) call handle_err(status)

      status = nf_inq_var(ncid, latid, dummy, xtype, ndim, dimids, natts)
      if (status /= nf_noerr) call handle_err(status)
      do j = 1, ndim
        status = nf_inq_dim(ncid, dimids(j), dummy, len)
        if (status /= nf_noerr) call handle_err(status)
        start(j) = 1
            count(j) = len
      enddo
      status = nf_get_vara_real(ncid, latid, start, count, lat)

  !----------------------------------------------------
  !  Retrieve data for Variable 'level'
!print*,ncid
      status=nf_inq_varid(ncid, 'level', levelid)
          if (status /= nf_noerr) call handle_err(status)

     status = nf_inq_var(ncid, levelid, dummy, xtype, ndim, dimids, natts)
    if (status /= nf_noerr) call handle_err(status)

     do j = 1, ndim
       status = nf_inq_dim(ncid, dimids(j), dummy, len)
       if (status /= nf_noerr) call handle_err(status)
       start(j) = 1
            count(j) = len
     enddo
! print*,ncid

    status = nf_get_vara_real(ncid, levelid, start, count, level)

!----------------------------------------------------
!   Retrieve data for Variable 'time'
    status=nf_inq_varid(ncid,'time',timeid)
          if (status /= nf_noerr) call handle_err(status)

     status = nf_inq_var(ncid, timeid, dummy, xtype, ndim, dimids, natts)
    if (status /= nf_noerr) call handle_err(status)
     do j = 1, ndim
      status = nf_inq_dim(ncid, dimids(j), dummy, len)
     if(status /= nf_noerr) call handle_err(status)
      start(j) = 1
      count(j) = len
     enddo

     status = nf_get_vara_int(ncid, timeid, start, count, time)

!----------------------------------------------------
!   Retrieve data for Variable 'hgt'

      status=nf_inq_varid(ncid, 'hgt', hgtid)
          if (status /= nf_noerr) call handle_err(status)

      status = nf_inq_var(ncid, hgtid, dummy, xtype, ndim, dimids, natts)
      if (status /= nf_noerr) call handle_err(status)
          write(*,*) dummy, xtype , ndim ,dimids, natts
!          pause
      do j = 1,ndim
        status = nf_inq_dim(ncid, dimids(j), dummy, len)
        if (status /= nf_noerr) call handle_err(status)
        start(j) = 1
            count(j) = len
      enddo

      status = nf_get_vara_real(ncid, hgtid, start, count, hgt)

      status = nf_close(ncid)
      if(status /= nf_noerr) call handle_err(status)
!----------------------------------------------------

print*,hgt(1,1,1,1)
end      

!---------------------- End Program  --------------------------
subroutine handle_err(status)

  include 'netcdf.inc'
  integer, intent ( in) :: status

  if(status /= nf_noerr) then
    print *, trim(nf_strerror(status))
  stop "Stopped"
  end if

end subroutine handle_err

结果:::
1.png 2.png

第二个图是我用论坛里面那个read_netcdf.f90读出来的,两次结果一样,但是位势高度不应该是这样的数值啊?我想知道我问题出在哪里了!

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-12-19 14:52:40 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-12-19 15:59:34 | 显示全部楼层
应该是数据还没有解包。还需获取hgt的add_offset和scale_factor属性,对hgt作一个简单的运算。具体参考:http://www.esrl.noaa.gov/psd/data/gridded/faq.html#2
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-12-19 18:38:02 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-6-16 16:43:33 | 显示全部楼层
您好,add_offset和scale_factor的值是怎么获取的?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-6-17 07:19:42 | 显示全部楼层
LOSER 发表于 2014-6-16 16:43
您好,add_offset和scale_factor的值是怎么获取的?

我是用PanoplyWin这个小软件获取的,应该还有其他办法
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-6-17 08:45:09 | 显示全部楼层
netcdf本身就有这个函数,请用我的小程序重新生成读netcdf数据的fortran程序,就ok了。
见:http://bbs.06climate.com/forum.php?mod=viewthread&tid=25183
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-6-17 09:06:07 | 显示全部楼层
aiai1992 发表于 2014-6-17 07:19
我是用PanoplyWin这个小软件获取的,应该还有其他办法

谢谢啦~用你的方法解决问题啦~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-6-17 09:20:13 | 显示全部楼层

我也来补充一下,很多的nc数据为了节省空间会把实型数据转换为整型数据存储,在用GrADS打开这种nc文件时,GrADS会自动转换为实型数据,但用fortran读这种数据时,需要做一个简单的转换: 整型数据*scale_factor+add_offset=实行数据。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-6-29 10:14:31 | 显示全部楼层
想问以下,status = nf_open('hgt.1950.nc', nf_nowrite, ncid)
      if ( status /= nf_noerr)  中的  nf_open,nf_nowrite,if ( status /= nf_noerr) 是什么意思呢,用来干什么的
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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