NCEP/NCAR再解析データ
netCDFデータの読み込みプログラムの例
プログラム (read_ncep.f90):
makefile:
データのダウンロードサイト: ftp.cdc.noaa.gov
ダウンロード方法
$ ftp -n < getflux.txt
getflux.txtの内容
open ftp.cdc.noaa.gov
user anonymous YOUR_EMAIL_ADDRESS
cd Datasets/ncep.reanalysis.dailyavgs/surface_gauss/
binary
get air.2m.gauss.2000.nc
by
YOUR_EMAIL_ADDRESSには、あなたのメールアドレスを入れてください。
データの書式
ncdumpコマンドを使うと、データの書式を調べることが出来ます。
$ ncdump -h air.2m.gauss.2000.nc
netcdf air.2m.gauss.2000 {
dimensions:
lon = 192 ;
lat = 94 ;
time = UNLIMITED ; // (366 currently)
variables:
float lat(lat) ;
lat:units = "degrees_north" ;
lat:actual_range = 88.542f, -88.542f ;
lat:long_name = "Latitude" ;
lat:standard_name = "latitude" ;
lat:axis = "Y" ;
float lon(lon) ;
lon:units = "degrees_east" ;
lon:long_name = "Longitude" ;
lon:actual_range = 0.f, 358.125f ;
lon:standard_name = "longitude" ;
lon:axis = "X" ;
double time(time) ;
time:units = "hours since 1-1-1 00:00:0.0" ;
time:long_name = "Time" ;
time:actual_range = 17522904., 17531664. ;
time:delta_t = "0000-00-01 00:00:00" ;
time:avg_period = "0000-00-01 00:00:00" ;
time:standard_name = "time" ;
time:axis = "T" ;
short air(time, lat, lon) ;
air:long_name = "mean Daily Air temperature at 2 m" ;
air:unpacked_valid_range = 150.f, 400.f ;
air:actual_range = 178.5f, 316.07f ;
air:units = "degK" ;
air:add_offset = 477.65f ;
air:scale_factor = 0.01f ;
air:missing_value = 32766s ;
air:precision = 2s ;
air:least_significant_digit = 1s ;
air:GRIB_id = 11s ;
air:GRIB_name = "TMP" ;
air:var_desc = "Air temperature" ;
air:dataset = "NCEP Reanalysis Daily Averages" ;
air:level_desc = "2 m" ;
air:statistic = "Mean" ;
air:parent_stat = "Individual Obs" ;
air:valid_range = -32765s, -7765s ;
// global attributes:
:Conventions = "COARDS" ;
:title = "mean daily NMC reanalysis (2000)" ;
:history = "created 00/01/30 by Hoop (netCDF2.3)" ;
:description = "Data is from NMC initialized reanalysis\n",
"(4x/day). It consists of T62 variables interpolated to\n",
"pressure surfaces from model (sigma) surfaces." ;
:platform = "Model" ;
:references = "http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html" ;
}
読み込みプログラム
program read_ncep
! Description:
!
! Author: aym
!
! Host: aofd30
! Directory: /work1/aym/11.Work10/15.HeatBudjet/51.jcope2/32.NCEP_FLUX/11.test_read_flux/src
!
! Revision history:
! 2011-02-22 16:38
! Initial Version
! References
! http://www.rain.hyarc.nagoya-u.ac.jp/laboratory/OB/shimizu/HTML/netcdf.html
! Tips: NetCDF. http://iprc.soest.hawaii.edu/users/sasakiyo/Japanese/misc/tips_netcdf.html
! NetCDF Tips. http://www.sci.hokudai.ac.jp/grp/poc/top/software/other/netcdf_tips/index.htm
! use
! implicit none
include '/usr/local/include/netcdf.inc'
! ncid:ファイルのID番号、 varid: 変 数のID番号
integer ncid,varid
character infle*500,ofle*500
character var*50
real,allocatable :: lon(:),lat(:)
real(8),allocatable :: time(:)
integer(2),allocatable :: sdata(:,:,:)
! real,allocatable :: sdata(:,:,:)
integer,allocatable :: dimids(:),nshape(:)
character*70 err_message
character*100 dimname !dimnameは各次元の名前。
write(*,'(a)')'Program read_ncep starts.'
! write(*,*)''
im=192
jm=94
nm=366
allocate(lon(im),lat(jm),time(nm),sdata(im,jm,nm))
infle="/work1/aym/0.data/02.NCEP_NCAR/01.Surface_Flux/surface_data/air.2m.gauss.2000.nc"
print '(A,A)','Input: ',infle(1:lnblnk(infle))
sta = nf_open(infle, nf_nowrite, ncid) ! ファイルのopenとNetCDF ID(ncid)の取得
print *,'ncid= ',ncid
print *,'status= ',sta
print *
!もし、openが上手く行かなかったら、sta /= 0となる。
if(sta.ne.0) then
! その時のエラー を教えてくれる。
err_message = nf_strerror(sta)
write(6,*) err_message
endif
var='air'
print '(A)',var(1:lnblnk(var))
! ファイルID(ncid)からvarで設定した変数のID(varid)を得る。
sta = nf_inq_varid(ncid,var,varid)
print *,'varid=', varid
print *,'sta= ', sta
print *
! スケールファクターを得る。(*1)
sta = nf_get_att_real(ncid,varid,'scale_factor',scale)
print *,'scale= ',scale
print *,'sta= ',sta
print *
! オフセットの 値を得る(*2)
sta = nf_get_att_real(ncid,varid,'add_offset',offset)
print *,'offset=', offset
print *,'sta= ',sta
print *
! varidからndimsを得る。ndimsとは次元の数。二次元データなら2
stat = nf_inq_varndims(ncid, varid, ndims)
print *,'ndims= ', ndims
print *
! varidからdimidsを得る。dimidsとはそれぞれの次元に対するID
allocate(dimids(ndims))
stat = nf_inq_vardimid(ncid, varid, dimids)
do i=1,ndims
write(6,'("dimids(",i2,")=",i9 )') i,dimids(i)
enddo
print *
allocate(nshape(ndims))
do i=1,ndims
! dimidsからnshapeを得る。
! nshapeとはそれぞれの次元に対する最大データ数 (格子数)
stat = nf_inq_dimlen(ncid, dimids(i), nshape(i))
write(6,'("nshape(",i2,")=",i9 )') i,nshape(i)
enddo !i
print *
do i=1,ndims
stat = nf_inq_dimname(ncid, dimids(i), dimname)
write(6,'("dimname(",i2,")=",1x,a23)') i,dimname
enddo
print *
print *,'Read ',var(1:lnblnk(var))
stat = nf_get_var_int2(ncid, varid, sdata)
print *,'stat= ',stat
var='lon'
print '(A)',var(1:lnblnk(var))
! ファイルID(ncid)からvarで設定した変数のID(varid)を得る。
sta = nf_inq_varid(ncid,var,varid)
print *,'varid=', varid
print *,'sta= ', sta
print *,'Read ',var(1:lnblnk(var))
stat = nf_get_var_real(ncid, varid, lon)
print *,'stat= ',stat
var='lat'
print '(A)',var(1:lnblnk(var))
! ファイルID(ncid)からvarで設定した変数のID(varid)を得る。
sta = nf_inq_varid(ncid,var,varid)
print *,'varid=', varid
print *,'sta= ', sta
print *,'Read ',var(1:lnblnk(var))
stat = nf_get_var_real(ncid, varid, lat)
print *,'stat= ',stat
print *
ofle="output/test.asc"
print '(A,A)','Output: ',ofle(1:lnblnk(ofle))
print *
open(20,file=ofle)
! Note: time index (n) is fixed and set to 1 here.
n=366
do j=1,jm
do i=1,im
varout=sdata(i,j,n)*scale + offset
write(20,'(2f12.6,f12.4,1x,2i5)') &
lon(i),lat(j),varout,i,j
enddo !i
enddo !j
close(20)
write(*,'(a)')'Done program read_ncep.'
write(*,*)
end program read_ncep
! *1: scaleとは、ある変数の平均的なオーダー
! *2: offsetとは、ある変数の平均的な値
! data(i,j) = sdata(i,j) * scale + offset
! のようにして、本当のデータを得る
実行例
$ ./read_ncep
Program read_ncep starts.
Input: /work1/aym/0.data/02.NCEP_NCAR/01.Surface_Flux/surface_data/air.2m.gauss.2000.nc
ncid= 3
status= 0.0000000E+00
air
varid= 4
sta= 0.0000000E+00
scale= 9.9999998E-03
sta= 0.0000000E+00
offset= 477.6500
sta= 0.0000000E+00
ndims= 3
dimids( 1)= 1
dimids( 2)= 2
dimids( 3)= 3
nshape( 1)= 192
nshape( 2)= 94
nshape( 3)= 366
dimname( 1)= lon
dimname( 2)= lat
dimname( 3)= time
Read air
stat= 0.0000000E+00
lon
varid= 2
sta= 0.0000000E+00
Read lon
stat= 0.0000000E+00
lat
varid= 1
sta= 0.0000000E+00
Read lat
stat= 0.0000000E+00
Output: output/test.asc
Done program read_ncep.
結果の確認
$ cd post
$ ls
cpt.xt foo.sh gmtpar.sh* note.sh* plmers.sh* plshum.sh* test.grd
$ chmod u+x plshum.sh
$ ./plshum.sh
Bash script plshum.sh starts.
Input : ../output/test.asc
Output : ../ps/test.ps
pstext: Record 6 is incomplete (skipped)
Done plshum.sh
plshum.sh (ダウンロード)
test.ps (ダウンロード)
備考
変数の読み込み nf_get_var_<変数型名>
変数の読み込みには、変数の型を正しく指定する必要がある。
参考文献
http://www26.atwiki.jp/rffbl22/pages/55.html