まだGrADSですが、grib2データの書き方です。データはいつものように京大生存研からいただきます。
まず、wgrib2とg2ctlのインストールが必要です。
$ wget ftp://ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/wgrib2.tgz $ tar xzvf wgrib2 $ cd grib2/ $ make # cp wgrib2/wgrib2 /usr/local/bin/
$ wget ftp://ftp.cpc.ncep.noaa.gov/wd51we/g2ctl/g2ctl $ chmod a+x g2ctl (最初の方にある$wgrib2を$wgrib2='/usr/local/bin/wgrib2';にかきかえる) # cp g2ctl /usr/local/binデータを取得した後、以下のシェルスクリプト(コマンドラインでもよい)
#!/bin/sh g2ctl -0 $1 > tmp.ctl gribmap -0 -i tmp.ctlを実行します。$1なのでシェル実行時にGrADSで読みたいgrib2形式のファイルを引数に指定します。
下準備として、
wget http://database.rish.kyoto-u.ac.jp/arch/jmadata/data/gpv/original/2014/10/20/Z__C_RJTD_20141020000000_GSM_GPV_Rgl_FD0312_grib2.bin g2ctl -0 $1 > tmp.ctl gribmap -0 -i tmp.ctlとしておいて、GrADSで
'reinit' 'open tmp.ctl' 'set mpdset hires' 'set lat 23 44' 'set lon 120 150' 'set gxout grfill' 'set clevs 5 10 20 40 80 160 320' 'set ccols 0 4 11 10 7 12 8 2 6' 'd apcpsfc' 'cbarn' 'set gxout contour' 'set cint 2' 'set ccolor 1' 'd prmslmsl*0.01' 'print -R' '!convert grads.eps grads.png'
#!/bin/sh day=20131125120000 hgt=500hgt temp=850temp slp=slp wgrib2 'Z__C_RJTD_'$day'_EPSW_GPV_Rgl_FD00-08_grib2.bin' -match ":HGT:500" -grib $hgt.grib2 wgrib2 'Z__C_RJTD_'$day'_EPSW_GPV_Rgl_FD00-08_grib2.bin' -match ":TMP:850" -grib $temp.grib2 wgrib2 'Z__C_RJTD_'$day'_EPSW_GPV_Rgl_FD00-08_grib2.bin' -match ":PRMSL:" -grib $slp.grib2 for i in $hgt $temp $slp do g2ctl -0 $i.grib2 > $i.ctl gribmap -0 -i $i.ctl doneとりあえず500高度と850気温とslpがみれればよいか。
異常天候早期警戒情報[EPS1]
wgrib2 Z__C_RJTD_20131125120000_GSM_GPV_Rgl_FD1100_grib2.bin -match ":HGT:" -no_header -ieee hgt.grdとすれば変数HGTの情報が単精度実数となってhgt.grdに書き出されます。これはfortranで書式なし直接形式big_endianで読めます。
echo "***WORKING ON "$1" HGT500 ***" wgrib2 $1 -match ":HGT:" -no_header -ieee hgt500.grd > hgt500.log echo "***WORKING ON "$2" TMP850 ***" wgrib2 $2 -match ":TMP:" -no_header -ieee tmp850.grd > tmp850.log
program readgribgrid
implicit none
integer :: i,j,k,l,nrec
integer,parameter :: nx=144,ny=73,nz=850
real(4),dimension(nx,ny,nz) :: h,hmean
open(10,file="hgt500.grd",form="unformatted",access="direct",convert='big_endian',recl=4*nx*ny)
open(11,file="tmp2")
open(12,file="hgt500member.grd",form="unformatted",access="direct",convert="little_endian",recl=4*nx*ny)
open(13,file="hgt500member.ctl")
open(14,file="hgt500mean.grd",form="unformatted",access="direct",convert="little_endian",recl=4*nx*ny)
open(15,file="hgt500mean.ctl")
do k=1,nz
read(10,rec=k) ((h(i,j,k),i=1,nx),j=1,ny)
end do
do l=1,17
do j=1,ny
do i=1,nx
do k=l,l+833,17
hmean(i,j,l)=hmean(i,j,l)+h(i,j,k)/50.0
end do
end do
end do
end do
nrec=1
do k=1,50
do l=1,17
write(12,rec=nrec) ((h(i,j,nrec),i=1,nx),j=1,ny)
nrec=nrec+1
end do
end do
do k=1,17
write(14,rec=k) ((hmean(i,j,k),i=1,nx),j=1,ny)
do j=1,ny
do i=1,nx
! write(*,*) hmean(i,j,k)
end do
end do
end do
write(13,*) "dset ^hgt500member.grd"
write(13,*) "undef 9.999E+20"
write(13,*) "title 500hgt.1monthfrcst.ensemble"
write(13,*) "xdef 144 linear 0.0 2.5"
write(13,*) "ydef 73 linear -90.0 2.5"
write(13,*) "zdef 17 linear 1 1"
write(13,*) "tdef 50 linear 00Z01JAN0001 1DY"
write(13,*) "VARS 1"
write(13,*) "hgt 17 0 height 500hpa"
write(13,*) "ENDVARS"
write(13,*) ""
write(15,*) "dset ^hgt500mean.grd"
write(15,*) "undef 9.999E+20"
write(15,*) "title 500hgt.1monthfrcst.ensemble.mean"
write(15,*) "xdef 144 linear 0.0 2.5"
write(15,*) "ydef 73 linear -90.0 2.5"
write(15,*) "zdef 1 levels 1"
write(15,*) "tdef 17 linear 00Z01JAN0001 1DY"
write(15,*) "VARS 1"
write(15,*) "hgt 1 0 height 500hpa"
write(15,*) "ENDVARS"
write(15,*) ""
stop
end program