標高2mの気温の分布図
データのダウンロードサイト: 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" ;
}
読み込みプログラム: read_ncep.f90
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
! のようにして、本当のデータを得る
makefile
#
#
#j Fortran77とFortran90/95の混成プログラムのコンパイル用makefile
#
#j 作成 Sun Feb 15 15:16:02 2009
#
#j 注:ごく簡単な動作チェックしか行っていない
#j サフィックスルールがこれで正しいかどうかチェックする必要あり
#
#j 参考文献
#j makefile の書き方
#j http://www.eis.osakafu-u.ac.jp/~yabu/soft/makefile.html
#j Makefile小技と新バージョンのDelFEM(FEMとUIの日記@New York)
#j http://d.hatena.ne.jp/etopirika5/20091207/1260207955
#
#-----------------------------------------
#j マクロの定義
#-----------------------------------------
#j コンパイラの指定
FC=ifort
#FC=gfortran
#FC=g77
#FC=f77
#j OBJDIR (オブジェクトファイルをおくディレクトリ)
OBJDIR=../obj
#-----------------------------------------
#j コンパイルオプション(ifort)
#-----------------------------------------
#j デバッグ用オプション(はじめて実行するときには必ずこのオプションをつけてコンパイルする)
FDFLAGS= -CB -traceback -fpe0
#j コンパイルオプション
FFLAGS=-module ${OBJDIR}
#j -module : モジュールファイル(.mod)を置く場所を指定する
#j 最適化用(他にも何種類かある. ifort -helpかマニュアルを見て調べる)
#FFLAGS = -O3 -module ${OBJDIR}
#j 倍精度
#FFLAGS = -r8 -module ${OBJDIR}
#j 入力データのバイト・スワップ(大型計算機のバイナリデータを読む時などにつかう)
#FFLAGS = #-convert big_endian -module ${OBJDIR}
#-----------------------------------------
#j リンク用のオプション
#-----------------------------------------
LDFLAGS=-L/usr/local/lib -lnetcdf -module ${OBJDIR}
#j ターゲット名(最終的に作りたい実行ファイル名)
TARGET1=../read_ncep
TARGET2=
TARGETS=$(TARGET1) $(TARGET2)
#j MOD (Fortran90以降のモジュールファイル)
MOD=
#j SRC7 (Fortran77のソースファイル)
SRC7=
#j SRC9 (Fortran90のソースファイル)
SRC9=read_ncep.f90
#j OBJ1 (ターゲットを作るのに必要なオブジェクトファイル名)
OBJM=$(MOD:.f90=.o)
OBJ7=$(SRC7:.f=.o)
OBJ9=$(SRC9:.f90=.o)
OBJTMP=$(OBJM) $(OBJ7) $(OBJ9)
OBJ1=$(OBJTMP:%=${OBJDIR}/%)
MOD2=
#j SRC7 (Fortran77のソースファイル)
SRC72=
#j SRC9 (Fortran90のソースファイル)
SRC92=
#j OBJ (ターゲットを作るのに必要なオブジェクトファイル名)
OBJM2=$(MOD2:.f90=.o)
OBJ72=$(SRC72:.f=.o)
OBJ92=$(SRC92:.f90=.o)
OBJTMP2=$(OBJM2) $(OBJ72) $(OBJ92)
OBJ2=$(OBJTMP2:%=${OBJDIR}/%)
OBJ=$(OBJ1) $(OBJ2)
#-----------------------------------------
#j ここからコンパイルのルールの記述
#-----------------------------------------
all: mkobjd $(TARGETS)
$(TARGET1): $(OBJ1)
$(FC) -o $@ $(OBJ1) ${LDFLAGS}
$(TARGET2): $(OBJ2)
$(FC) -o $@ $(OBJ2) ${LDFLAGS}
#j 暗黙のサフィックスルールを無効にする
.SUFFIXES:
#j サフィックスの追加
.SUFFIXES: .o .f .f90
#j f77のソースファイルのコンパイル(.f用のサフィックスルール)
${OBJDIR}/%.o : %.f
$(FC) -c ${FDFLAGS} ${FFLAGS} -c -o $@ $<
#j f90のソースファイルのコンパイル(.f90用のサフィックスルール)
${OBJDIR}/%.o : %.f90
$(FC) -c ${FDFLAGS} ${FFLAGS} -c -o $@ $<
#j オブジェクトファイルを削除
clean:
rm -rf $(OBJ) ${OBJDIR}/*.mod
#j オブジェクトファイルと実行ファイルを削除
distclean:
rm -rf $(OBJ) ${OBJDIR}/*.mod $(TARGETS) ¥
rm -rf ${OBJDIR}
#j オブジェクトファイルを置くディレクトリを作成
mkobjd:
if [ ! -d ${OBJDIR} ]; then ¥
mkdir -p ${OBJDIR} ; ¥
fi
#j tarファイルを作る
tar:
tar cvf $(TARGET1).tar ./*.f90 ./*.f ./*.c ./*.h ./*.txt makefile
実行例
$ ./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
#!/bin/sh
# Description:
#
# Author: aym
#
# Host: aofd30
# Directory: /work1/aym/11.Work10/15.HeatBudjet/51.jcope2/32.NCEP_FLUX/11.test_read_flux/post
#
# Revision history:
# 2011-02-23 14:37
# Initial Version
. gmtpar.sh
echo "Bash script plshum.sh starts."
range=0/360/-88/88
size=5
xanot=a60f30
yanot=a30f30
in="../output/test.asc"
if [ ! -f $in ]; then
echo Error in $0 : No such file, $in
exit 1
fi
psdir="../ps/"
if [ ! -d ${psdir} ];then
mkdir -p $psdir
fi
out=${psdir}$(basename $in .asc).ps
echo Input : $in
echo Output : $out
reso=1/1
tension=1
grd=$(basename $in .asc).grd
surface $in -R$range -I$reso -T$tension -G$grd
cpt=cpt.xt
makecpt -Chaxby -T230/320/1 > $cpt
#grdcontour $grd -R -JQ0/$size -A5f12 \
grdimage $grd -R -JQ0/$size -C$cpt \
-P -K \
-X1.5 -Y1.5 \
> $out
#psxy $in -R -JQ -Sc0.01 -G0 -O -K >> $out
pscoast -R -JQ -Dc -W1 -O -K >> $out
psbasemap -R -JQ -B$xanot/${yanot}WSne \
-O -K \
>> $out
xoffset=
yoffset=5
comment=""
. note.sh
echo "Done plshum.sh"
変数の読み込み nf_get_var_<変数型名>
変数の読み込みには、変数の型を正しく指定する必要がある。
ncdumpで見たときの変数型 nf_get_var関数
short nf_get_var_INT2
floatまたはreal nf_get_var_real
double nf_get_var_double
参考文献
http://www26.atwiki.jp/rffbl22/pages/55.html