gtool4で熱帯降雨の絵を描こう!!

目次

はじめに

このページは地球流体電脳倶楽部開発の格子点データ解析ツールgtool4/gtviewのチュートリアルページです. ここでは熱帯降雨観測衛星 TRMM によって観測された熱帯域の降雨プロファイルを例にとり, gtool4を使って降雨分布のDCLの絵が書けるまでを解説します.

本ページの解説は大きく 2 つに分かれています. バイナリデータを netCDF 形式のデータに変換するプログラムの解説, もうひとつは生成した netCDF データを用いた gtool4のクイックビュー機能の具体的な使い方の紹介です.


用意するもの

  • OS が Debian GNU/Linux でインストールガイドに示すソフトウェアが インストールされたPC

    Debian/GNU Linux のインストール方法については Debian JP, インストールマニュアルを参照ください.

  • gtool4のインストールで示す各ツール

  • ESRDC-007   TRMM Rain Data set TMI(1999-2000), PR(1998-2000)

    宇宙開発事業団の地球観測利用研究センターが配布する
    地球気候変動研究のためのCD-ROMシリーズの一つ. 取得方法は以下のとおり.

目次へ戻る

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に格納されているファイルのデータ形式について簡単に解説します.

  • データ書式

    各々のファイルはヘッダ部とデータ部に分かれています. 各部にはバイナリフォーマットのデータが以下の形式で格納されています.

    ヘッダ部FORTRAN の文字配列をUNFORMATTED形式で格納
    データ部FORTRAN の 2byte INTEGER をUNFORMATTED形式で格納

    以下ではヘッダ部とデータ部それぞれについて解説します.

    • ヘッダ部

      ヘッダは 80 文字 × 7 行の文字配列で, 各行には以下の内容が記述されています.

      1 行目:データ種別      |例 : TRMM/PR/Global
      2 行目:アルゴリズム    |例 : create:NASDA
      3 行目:作成者          |例 : NASDA
      4 行目:期間            |例 : time:2000/1
      5 行目:緯度の範囲      |例 : 38S--38N
      6 行目:経度の範囲      |例 : 0E--180--0.5W
      7 行目:データの格子数  |例 : 720x153; (1,1)=(0E,38S)
      
    • データ部

      データは対応する格子点に対して一つの物理量が 2byte 整数で格納されています. 例えば全球データの場合, 格子点(720, 153)の大きさの配列に対して 緯度と経度を

             (1,1)     : (0E,38S)
             (720,153) : (0.5W,38N)
      

      と対応させています. ここでE, W, S, Nはそれぞれ東経, 西経, 南緯, 北緯を表しています.

      格納されているデータは ファイルによって異なる物理量が記録されています. 詳細は CD-ROM に収録されている readme.txt を参照ください.

  • バイト並び

    バイト並びは big endian です.

このように対象とするデータはバイナリなため, gtool4 で扱うためには, Gtool4 NetCDF Convention に順ずる netCDF 形式のデータに変換しなければなりません. しかも big endian なため, PC で扱うには注意が必要です. 次のステップではバイナリデータから netCDF データを生成するためのプログラムについて解説します.


変換プログラム解説

CD-ROM に格納されているバイナリファイルから変数を読み込み, 同じ内容の netCDF ファイルを生成するプログラムを 作成します. 以下にサンプルプログラムを示します. このプログラムは gpr00100 というバイナリファイルの内容を netCDF 形式のデータで書き出すプログラムです.

例: bin2nc_gpr00100.f90


上記のプログラムは大体以下のような内容になっています..

通常の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 ファイルの生成と定義モードの開始を宣言する関数です.

fname生成する netCDF ファイル名. (ex. gpr00100.nc)
cmode 生成モード. サンプルプログラムの場合, 同名のファイルが存在する場合, 書き込みをしないnf90_noclobberフラグが立てられている.
ncidnetCDF ファイル ID. Fortran/C インターフェイスではファイルや変数は生成時に割り当てられるファイルIDと呼ばれる整数によって識別される. 以降, ファイルや変数はファイルIDを用いて指定することになる. (参考:NetCDF ユーザーマニュアル 日本語ガイド)

4. 次元変数, 通常変数の定義(77-114行目)

nf90_def_dim(ncid,name,len,dimid)

nf90_def_dim() は 次元 を定義する関数です.

ncidnetCDF ID.
name 次元の名前. 省略形にあたる適当な値を代入する. (例:緯度 = lat)
len 次元長. 次元が持ちうる値の数. 格子点の数と思えば良い.
dimid 次元 ID.
nf90_var_dim(ncid,name,xtypes,dimids,varid)

nf90_def_var() は 変数 を定義する関数です.

ncidnetCDF ID.
name 変数の名前. 省略形にあたる適当な値を代入する. (例:緯度 = lat)
xtypes 変数の外部型. サンプルプログラムの場合, 倍精度の変数を生成する . nf90_doubleが指定されている. 後述の で指定されるデータのかたまりと型が異なる場合は, 適宜型変換が行われる. 詳細は を参照.
dimids 変数の次元に対応する, 次元 IDベクトル. 無制限次元の ID が含まれる場合は最後にこなくてはならない.
varid 変数 ID.

5. 属性の記述 (119-170行目)

nf90_put_att(ncid,varid / nf90_global,name,values)

nf90_put_att() は 属性を与える関数です. 属性とは netCDF ファイルがもつプロパティです.

ncidnetCDF ID.
varid 変数 ID. ファイル全体の属性である大域属性を与えるときは, nf90_globalを与える.
name 定義する属性. 与えるべき属性は利用する規約に準ずる.
values 与える属性値.

6. 定義モードの終了を宣言 (175行目)

nf90_enddef(ncid)

nf90_enddef() は引数に指定された netCDF ID のファイルの定義モードを終了します. 同時にデータの書き込みモードへ移行します.

7. 値の書き込み(182-232行目)

nf90_put_var(ncid,varid,values,start)

nf90_put_att() は 属性を与える関数です. 属性とは netCDF ファイルがもつプロパティです.

ncidnetCDF ID.
varid 変数 ID. ファイル全体の属性である大域属性を与えるときは, nf90_globalを与える.
values 書き込まれるデータ. 単一の値, もしくは配列で指定される. 配列の大きさは書き込む NetCDF 変数の大きさと一致する必要はない. その場合, 次のstartで指定される要素から配列の終りの値までが書き込まれる.
start 書き込まれるデータの開始位置を指定するベクトル. 変数の最初のデータの要素は(1,1,1,..)である.

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のコマンドリファレンス等で解説しています. 参考にしてみてください.


目次へ戻る

個人的なメモ書き

参考文献


目次へ戻る

Copyright (C) 2003 daktu32
最終更新:2003年08月02日
http://www.gfd-dennou.org/arch/gtool4/gtool4-tutorial/trmm/gtool4_de_trmm.html