请选择 进入手机版 | 继续访问电脑版
爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 38849|回复: 33

[源代码] 基于GSI读取bufr文件

[复制链接]

新浪微博达人勋

发表于 2015-11-12 16:39:20 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 张__QI 于 2015-11-12 22:09 编辑
  1. #! /bin/sh
  2. #
  3. #extract necp bufr information and data
  4. #

  5. bufr_path="/home/qzhang/2011_07_18/gdas.airsev.t00z.20110718.bufr"
  6. exe_path="/home/qzhang/airsev"
  7. include_path="/home/qzhang/GSI/comGSI_v3.3/include"
  8. bufr_lib_path="/home/qzhang/GSI/comGSI_v3.3/lib"

  9. mkdir $exe_path
  10. cat << EOF > $exe_path/extract.f90
  11. program bufr_decode_radiance
  12. !
  13. ! read all radaince observations out from bufr.
  14. ! read bufr table from prepbufr file
  15. !
  16. implicit none

  17. integer, parameter :: mxmn=35, mxlv=250
  18. character(80):: hdstr= &
  19.    'SAID FOVN YEAR MNTH DAYS HOUR MINU SECO CLAT CLON CLATH CLONH HOLS'
  20. character(80):: hdr2b='SAZA SOZA BEARAZ SOLAZI'
  21. character(80):: obstr='TMBR'
  22. ! character(80):: obstr='TMBRST'
  23. real(8) :: hdr(mxmn),hdr2(mxmn),obs(mxlv)

  24. INTEGER        :: ireadmg,ireadsb

  25. character(8)   :: subset
  26. integer        :: unit_in=10,idate,nmsg,ntb
  27. integer,parameter:: max_sat_type=20
  28. integer        :: nsat_type(max_sat_type),nsat_num(max_sat_type)
  29. integer        :: i,k,iret,ksatid,nchanl,num_sat_type,ii
  30. !
  31. nchanl=15
  32. nsat_num=0
  33. nsat_type=0
  34. !
  35. open(24,file='bufr.table')
  36. open(unit_in,file='$bufr_path',form='unformatted',status='old')
  37. call openbf(unit_in,'IN',unit_in)
  38. call dxdump(unit_in,24)
  39. call datelen(10)
  40.    nmsg=0
  41.    ntb = 0
  42.    num_sat_type = 0
  43.    msg_report: do while (ireadmg(unit_in,subset,idate) == 0)
  44.      nmsg=nmsg+1
  45.      write(*,*)
  46.      write(*,'(3a,i10)') 'subset=',subset,' cycle time =',idate
  47.      sb_report: do while (ireadsb(unit_in) == 0)
  48.        ntb = ntb+1
  49.        call ufbint(unit_in,hdr ,mxmn,1  ,iret,hdstr)
  50.        call ufbint(unit_in,hdr2,mxmn,1  ,iret,hdr2b)

  51.        call ufbrep(unit_in,obs ,1   ,nchanl,iret,obstr)
  52.        ksatid=nint(hdr(1))
  53.        write(*,*) ntb,iret,ksatid
  54.        write(*,*),(hdr(i),i=3,5)
  55.        write(*,*),(hdr(i),i=6,8)
  56.        write(*,*),(hdr(i),i=9,10)
  57.        !write(*,'(a10,15f7.1)') 'obs=',(obs(i),i=1,iret)

  58. ! satellite type inventory
  59.        if(num_sat_type == 0 ) then
  60.           num_sat_type=1
  61.           nsat_type(num_sat_type)=ksatid
  62.           nsat_num(num_sat_type)= 1
  63.        else
  64.           ii=0
  65.           DO i=1,num_sat_type
  66.              if(nsat_type(i) == ksatid) ii=i
  67.           ENDDO
  68.           if( ii > 0 .and. ii <=num_sat_type) then
  69.              nsat_num(ii)=nsat_num(ii) + 1
  70.           else
  71.              num_sat_type=num_sat_type+1
  72.              if(num_sat_type > max_sat_type) then
  73.                 write(*,*) 'Error: too many satellite types'
  74.                 write(*,*) 'Need to increase max_sat_type'
  75.                 stop 1234
  76.              endif
  77.              nsat_type(num_sat_type)=ksatid
  78.              nsat_num(num_sat_type)=1
  79.           endif
  80.        endif

  81.      enddo sb_report
  82.    enddo msg_report
  83. call closbf(unit_in)

  84. write(*,*) 'message=',nmsg,'  subset=',ntb
  85. DO i=1,num_sat_type
  86.    write(*,'(i4,2i10)') i,nsat_type(i),nsat_num(i)
  87. ENDDO


  88. end program
  89. EOF

  90. cd $exe_path
  91. ifort  -O2   -I $include_path -c extract.f90
  92. ifort  -o extract.exe -O2   extract.o -L $bufr_lib_path -lbufr_i4r8
  93. ./extract.exe &> info.data
复制代码

老板脑洞开的有点大,让我把卫星辐射数据每条记录的经纬度信息画出来看看。没办法只能照做。

献上bash脚本一个,为大家提供灌水的素材。

如果要把bufr文件里的辐射数据输出出来,只需要在脚本最内层循环里面加上这句话:write(*,*) 'obs=',(obs(i),i=1,iret)即可。

脚本地址献上:

https://github.com/smft/ncep_bufr_reader_based_on_gsi

截个图,证明 it really works!
amub.png
hrs3.png
hrs4.png
MHS.png

extract_bufr_data.sh

2.91 KB, 下载次数: 41, 下载积分: 金钱 -5

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

新浪微博达人勋

发表于 2015-11-12 19:06:09 | 显示全部楼层
大哥,发错地方拉,这是python板块,不是fortran板块
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-11-12 19:59:13 | 显示全部楼层
的确。。。。这是fortran吧。。。。{:eb315:}{:eb315:}
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-11-12 22:16:06 | 显示全部楼层
不想去fortran
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-11-13 12:21:31 | 显示全部楼层
哈哈哈,这样的话,大家可以试着把这段代码实现的功能改成python的?嘿嘿,都是个学习的过程呀
{:eb301:}{:eb301:}
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-11-14 11:26:53 来自手机 | 显示全部楼层
支持牛人!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2015-11-16 08:49:09 | 显示全部楼层
最主要的问题是有一个Fortran版本的prepbufr库,不知道Python有没有对应版本,要有这个才行
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-11-17 17:38:42 | 显示全部楼层
虫儿飞 发表于 2015-11-16 08:49
最主要的问题是有一个Fortran版本的prepbufr库,不知道Python有没有对应版本,要有这个才行

已测,没有
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-11-17 17:39:05 | 显示全部楼层
虫儿飞 发表于 2015-11-16 08:49
最主要的问题是有一个Fortran版本的prepbufr库,不知道Python有没有对应版本,要有这个才行

已测,没有。。。。。。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-11-23 09:11:04 | 显示全部楼层
感谢分享啦
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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