Gallery

■NETCDFを読み込む(バイナリに変換)

Step.0 まずは中身を確認しましょう.
$ncdump ALMIP2_ECOCLIMAP2_05_Niger.nc | less

例に出したファイルだと,こんなデータが見れます.

以下は具体的なデータが並びます.
このままデータを使える人は良いのですが,僕の場合は普段使うバイナリに変換したい.
バイナリへの変換方法は二通りあります.
1つ目は,gradsのコマンドを使う方法,こちらが簡単なので,使えるならこちらの方がいい.
2つ目は,fortranのプラグラムを用いる方法.gradsの方法が万能ではないので,こちらを使わざるを得ない場合もある.

Step.1 gradsを使った変換方法

gradsを使ってnetcdfファイルを開けます.(ctlファイルは不要)

$grads
$sdfopen ALMIP2_ECOCLIMAP2_05_Niger.nc
$q file

上とファイルと同じデータですが,q file で確認できるのは,sand, clay, rsmin, droot, dsoilの5種でした.
実は,ファイルを開く際にエラーが出ていて,全てを開けない場合があるようです.
(ここの原因は未だ不明,分かった場合はアップデートします.)

さて,gradsのsdfopenで確認できるデータは,バイナリに変換する事が出来ます.
例えば,こんな感じのスクリプトを書きます.

tnum=05
bnum='Niger'

'sdfopen ALMIP2_ECOCLIMAP2_'tnum'_'bnum'.nc'

'set x 1 32'
'set y 1 26'
'set z 1 1'
'set t 1 1'

'set fwrite -le ../Landpara/SOIL_'bnum'_ALMIP2_ECOCLIMAP2_20'tnum'.bin'
'set gxout fwrite'
'd sand'
'd clay'
'd rsmin'
'd droot'
'd dsoil'
'disable fwrite'

return

見て分かるように,setで,x,y,z,tの次元を定義します.
気象強制力等,tの次元やzの次元があってもバイナリに出来ます.
下では,データ毎に出力ファイルを変えた時の例.

tnum=2005
bnum='Niger'
tmax =17521
mnum='Lagrangien'
*mnum='Thiessen'

'sdfopen Forcing_AMMA_0.05_'bnum'_ECMWF_SAF_'mnum'_'tnum'.nc'

if(tnum=2008) tmax=17569; endif

'set x 1 32'
'set y 1 26'
'set z 1'
'set t 1 'tmax''

'set fwrite -le ../Forcing/TAIR_AMMA_0.05_'bnum'_ECMWF_SAF_'mnum'_'tnum'.bin'
'set gxout fwrite'
'd tair'
'disable fwrite'

'set fwrite -le ../Forcing/QAIR_AMMA_0.05_'bnum'_ECMWF_SAF_'mnum'_'tnum'.bin'
'set gxout fwrite'
'd qair'
'disable fwrite'

'set fwrite -le ../Forcing/WIND_E_AMMA_0.05_'bnum'_ECMWF_SAF_'mnum'_'tnum'.bin'
'set gxout fwrite'
'd wind_e'
'disable fwrite'

'set fwrite -le ../Forcing/WIND_N_AMMA_0.05_'bnum'_ECMWF_SAF_'mnum'_'tnum'.bin'
'set gxout fwrite'
'd wind_n'
'disable fwrite'

'set fwrite -le ../Forcing/PSURF_AMMA_0.05_'bnum'_ECMWF_SAF_'mnum'_'tnum'.bin'
'set gxout fwrite'
'd psurf'
'disable fwrite'

'set fwrite -le ../Forcing/RAINF_AMMA_0.05_'bnum'_ECMWF_SAF_'mnum'_'tnum'.bin'
'set gxout fwrite'
'd rainf'
'disable fwrite'

'set fwrite -le ../Forcing/SNOWF_AMMA_0.05_'bnum'_ECMWF_SAF_'mnum'_'tnum'.bin'
'set gxout fwrite'
'd snowf'
'disable fwrite'

'set fwrite -le ../Forcing/SWDOWN_AMMA_0.05_'bnum'_ECMWF_SAF_'mnum'_'tnum'.bin'
'set gxout fwrite'
'd swdown'
'disable fwrite'

'set fwrite -le ../Forcing/LWDOWN_AMMA_0.05_'bnum'_ECMWF_SAF_'mnum'_'tnum'.bin'
'set gxout fwrite'
'd lwdown'
'disable fwrite'

'set t 1 1'
'set fwrite -le ../Forcing/ELEV_AMMA_0.05_'bnum'_ECMWF_SAF_'mnum'_'tnum'.bin'
'set gxout fwrite'
'd elevation'
'disable fwrite'

return
Step.2 fortranのプログラムを用いる場合.

netcdfのインクルードファイルを使う必要があります.
この方法は結構めんどくさいので,gradsで出来るならその方がいいと思います.
○実際にERA40を読み込んだ時のプログラム

めんどくさいですね.netCDFの関数を用いる必要があります.
大まかに言うと,コツは2点です.

1.プログラムの最初に,インクルードファイルを定義する.
2.VALUEと一緒に,scalefactorやadd_offsetを読み込むのを忘れない.

2.については,後で四則演算して,正しい値に変更する必要があります.
scalefactorやadd_offsetが必要じゃないファイルもあります.
これは,先ほどのncdumpの変数の所を見ると確認できます.
多分,ファイルを圧縮するためにこういうシステムを用いているのだと思います.

また,コンパイルの仕方も少々特殊で,オプションを付ける必要があります.

ifort -o read_ecoclimap read_ecoclimap.f -Inetcdf-4.0/include -Lnetcdf-4.0/lib -lnetcdf ./read_ecoclimap
Step.3 さいごに

なれると意外と簡単です.
間違い等に気づけば,随時アップデートしていきます.
お気づきの点などあれば,連絡して頂けると幸いです.

  • Back to home