目次はじめにこのページは地球流体電脳倶楽部開発の格子点データ解析ツールgtool4/gtviewのチュートリアルページです. ここでは熱帯降雨観測衛星 TRMM によって観測された熱帯域の降雨プロファイルを例にとり, gtool4を使って降雨分布のDCLの絵が書けるまでを解説します. 本ページの解説は大きく 2 つに分かれています. バイナリデータを netCDF 形式のデータに変換するプログラムの解説, もうひとつは生成した netCDF データを用いた gtool4のクイックビュー機能の具体的な使い方の紹介です. 用意するもの
gtool4 のインストールgtool4を利用するために必要なソフトウェアのインストールガイドです. ここでは Fujitsu Fortran Compiler(以下 FFC と呼ぶ) か Intel Fortran Compiler (以下 IFC と呼ぶ)のどちらかを コンパイラに用いる場合のドキュメントを紹介します. 利用するコンパイラに応じてドキュメントを参照ください. バイナリデータを netCDF 形式へ変換ここでは TRMM のデータを netCDF 形式に変換します. 変換には netCDF ライブラリの F90 インターフェイスを用いて, プログラムを書きます. まず始めに CD-ROM に格納されているデータのフォーマット等を簡単に解説し, その後 netCDF ライブラリの説明をします. 最後にサンプルプログラムを用いて, 実際に TRMM のデータを netCDF 形式に変換します. netCDF ファイルを作成するときに気にすることとして, どの規約に従うかということが挙げられます. 規約とは netCDF ファイルの属性のつけ方, ルールです. gtool4 は 自己の扱う netCDF 規約として gtool4 - netCDF 規約を採用しています. よってこの節で変換するデータは gtool4 - netCDF 規約に従い生成することにします.
■CD-ROM内のファイルのデータCD-ROMに格納されているファイルのデータ形式について簡単に解説します.
このように対象とするデータはバイナリなため, gtool4 で扱うためには, Gtool4 NetCDF Convention に順ずる netCDF 形式のデータに変換しなければなりません. しかも big endian なため, PC で扱うには注意が必要です. 次のステップではバイナリデータから netCDF データを生成するためのプログラムについて解説します.
■ 変換プログラム解説CD-ROM に格納されているバイナリファイルから変数を読み込み, 同じ内容の netCDF ファイルを生成するプログラムを 作成します. 以下にサンプルプログラムを示します. このプログラムは gpr00100 というバイナリファイルの内容を netCDF 形式のデータで書き出すプログラムです. 上記のプログラムは大体以下のような内容になっています.. 通常のFortranプログラムで必要な部分 1. コード中で使用する変数の宣言 2. 元データ (TRMM/CD-ROM) から必要な変数の値を読み込む netCDF 関連部分 3. netCDF ファイルの生成および定義モード開始を宣言 4. 次元変数, 通常変数の定義 5. 属性の記述 6. 定義モード終了を宣言 7. 2. で読み込んだデータの値を各変数へ値の代入 8. netCDF ファイル作成終了を宣言 ここからはプログラムの netCDF 関連部分中の各モードについて解説します. より詳しい解説はUNIDATAの公式ガイド を参照ください. 3. netCDFファイルの生成宣言(72行目)nf90_create(fname,cmode,ncid) nf90_create() はnetCDF ファイルの生成と定義モードの開始を宣言する関数です.
4. 次元変数, 通常変数の定義(77-114行目)nf90_def_dim(ncid,name,len,dimid) nf90_def_dim() は 次元 を定義する関数です.
nf90_var_dim(ncid,name,xtypes,dimids,varid) nf90_def_var() は 変数 を定義する関数です.
5. 属性の記述 (119-170行目)nf90_put_att(ncid,varid / nf90_global,name,values) nf90_put_att() は 属性を与える関数です. 属性とは netCDF ファイルがもつプロパティです.
6. 定義モードの終了を宣言 (175行目)nf90_enddef(ncid) nf90_enddef() は引数に指定された netCDF ID のファイルの定義モードを終了します. 同時にデータの書き込みモードへ移行します. 7. 値の書き込み(182-232行目)nf90_put_var(ncid,varid,values,start) nf90_put_att() は 属性を与える関数です. 属性とは netCDF ファイルがもつプロパティです.
8. 作成したnetCDFファイルを閉じる(238行目)nf90_close(ncid) nf90_close() は引数に指定された netCDF ID のファイルを閉じます. 補足:エラー表示用のサブルーチン(244-254行目)246 subroutine handle_err(status) 247 integer, intent (in) :: status 248 if(status /= nf90_noerr) then 249 print *, trim(nf90_strerror(status)) 250 stop "Stopped" 251 end if 252 end subroutine handle_err 実際のプログラムではここで紹介してきた関数は stat = hogehoge という式で書かれてていました. この stat は右辺の式がエラーを返したとき, エラー表示する関数を呼び出します. 以上でサンプルプログラムの解説は終りです. 各々の関数についてのより詳しいドキュメントは文末の参考文献において紹介しますのでそちらをご覧ください. また属性の与え方や変数の長さを定義する規約についても, 参考文献を参照ください.
■ サンプルプログラムをコンパイルそれでは上記のサンプルプログラムをつかって, 実際にCD-ROM内のデータをnetCDF形式に変換しましょう. ここでは gpr00100 というデータを例に話を進めていきます. このデータはTRMM搭載のPRによって観測された 2000年1月の月平均降雨量データです. まず, CD-ROMをマウントし, CD-ROM内部にアクセスします. $ mount /dev/cdrom /cdrom $ cd /cdrom 次にgpr00100.zip のあるディレクトリまで移動します. $ cd /cdrom/global/pr_preci/2000/monthly 任意のディレクトリにコピーし解凍してください.
$ cp gpr00100.zip ~/temp/ $ unzip gpr00100.zip 上述のプログラムをgpr00100と同じディレクトリに置き, 以下のようにコンパイルしてください. 1行です. FFC でコンパイルする場合% frt -Am -I/usr/local/netcdf-3.5/include/ bin2nc_gpr00100.f90\ -L/usr/local/netcdf-3.5/lib/ IFC でコンパイル場合% ifc -I/usr/local/netcdf-3.5/include/ bin2nc_gpr00100.f90\ -L/usr/local/netcdf-3.5/lib/ -lnetcdfこのとき以下のようなメッセージが表示されますが問題ありません. jwd2004i-i "bin2nc_gpr00100.f90", line 91: この変数 headerは, 値を設定していますが引用され ていません. a.outが生成されたことを確認したら, いよいよ実行です. このとき big endian形式を扱うFujitsu Fortranの実行オプションをつけて実行します. ifc の場合, 環境変数 F_UFMTENDIAN の値を big とします. FFC でコンパイルする場合% ./a.out -Wl,-T IFC でコンパイル場合% export F_UFMTENDIAN = big % ./a.out これで バイナリファイルの netCDF 化ができました. gtool4 でクイックビューnetCDFデータを用意できたところで, gtool4でデータを図示してみましょう. netCDFファイルのクイックビュー機能であるgtviewコマンドを用います.
■ まずは描いてみるもっともシンプルな画を描きましょう. 以下のコマンドを実行してください. % gtview gpr00100.nc@prすると以下のような図が表示された事と思います. ファイル名の後ろのprは変数名です. この場合降雨量を意味します. ファイル名のみ指定した場合はnetCDFファイル中の適当な変数をgtool4側で選んで描画してくれます. また3つ以上の次元をもつ変数の場合, これまた適当な次元を選択して2次元断面図を描画します. 図の上部に表示されているのはタイトルです. デフォルトでは描画している変数のlong_name属性が引数にとられ, 描画されます. また図の座標軸にはそれぞれの軸の名前(例:longitude, latitude), 軸の方向(例:degree_east,東)が表示されています. これもnetCDFファイルで定義した属性が引数にとられ表示されます. contour intervalは等値線の間隔を, 右下のdateは今日の日付が描かれます.
■ 地図投影/縦横比調整しかしながら上記の図からは何がなんだかわかりませんよね. 今度は以下のようにオプションをつけて実行しましょう. % gtview gpr00100.nc@pr -map aspect=4.7
-mapはメルカトル図法で投影された地図を重ねるオプションです. 図の縦軸の0の値の直線上に赤道が, 横軸の0の値の直線上に東経0度線が重ねられます. 座標軸の単位長さが1度に割り当てられます.-aspectは図の縦横比を指定するオプションです. -aspect=横軸の長さ/縦軸の長さの形で指定します. この図の範囲は北緯37度--南緯37度, 東経0度--西経180度--東経0度の範囲をとっているので, 大きさを合わせると縦横比は約4.7となるのです.
■ 色をつける更にオプションを付け加えましょう. 今度は色をつけます. % gtview gpr00100.nc@pr -map aspect=4.7 -shade -shadeは色の塗分と 等値線の描画を両方行います. 一方, 等値線を描かないときは-nocontを指定します. % gtview gpr00100.nc -map aspect=4.7 -nocont デフォルトでは等値線の本数および塗り分け数は 12 個ですが変更することもできます. 色の塗り分けを 100 等分し, 等値線を5本引く場合は以下のようにします. % gtview gpr00100.nc -map aspect=4.7 -shade sint=-100 cint=-5
sintは色の塗分間隔を指定します. 指定される引数が正であればその値ごとに, 負であればその数だけ塗分をします. この場合全体を100分割して色を塗り分けます. 同様にcintは等値線の間隔を指定します.
■ 次元の範囲指定いままでの図は全て地上における降雨量を図示してきました. これは 特に何も指定しない場合 gtview が自動で適当な断面を選択し描画しているためです. 今度は高度 2 km における降雨量を見ましょう. % gtview gpr00100.nc@pr,alt=2 -map aspect=4.7 -nocont sint=-100
変数, 次元 = x とすると, ある次元の x の値における断面を描画します. 以下は経度 0 度における緯度-高度断面図です. % gtview gpr00100.nc@pr,lon=0 aspect=4.7 -nocont sint=-100
今度は特定の範囲を指定して描画しましょう. 以下のような書式になります. % gtview gpr00100.nc@pr,lon=0:188,lat=-20:20 -map aspect=4.7 -nocont sint=-100
変数, 次元 = x:y, 次元変数... である変数のもつある次元の x から y までを描画します. ここで紹介しきれなかったオプションについてはgtviewのコマンドリファレンス等で解説しています. 参考にしてみてください. 個人的なメモ書き
参考文献
■ gtool4 関連
■ netCDF 関連
■ TRMM 関連
■ Fortran90 プログラミング
■ Fortran90 コンパイラ
■ Debian インストール
Copyright (C) 2003 daktu32
最終更新:2003年08月02日 http://www.ep.sci.hokudai.ac.jp/~daktu32/study/gtool4/gtool4_de_trmm.html |