1. お絵描きの基礎(1) 〜GrADS篇 |
1.1 GrADSとは? |
GrADS (Grid Analysis and Display System)は地球科学関連のデータを
処理・図化するための対話式ソフトで, 基本的には4次元(x, y, z, t)の
大量格子データを扱うのに適している.
アメリカのCenter for
Ocean-Land-Atmosphere Studies (COLA)という研究機関の専属
グループが開発・維持しており, 現在はUnix, LinuxのみならずWindows, MacIntosh
にも対応している. 詳しくはGrADSサイトを見てください.
GrADSユーザとなるにあたって, 基本的なことはこの演習でやりますが
もっといろいろなことがやりたくなったら一度はGrADSのドキュメントに目を通すことをお勧めします. これは
英文ですが, 専攻で以前作った日本語の手引
日本語の手引もあります.
1.2 まずは何かプロットしてみましょう |
user maroさんが, 以下のことをします.
- 500hPa高度場の月平均データを渡部のホームからとってきて
- GrADSで開き
- 中身を確認し
- とにかく図を描いてみて
- GrADSを終える
[/home/maro/data/%] cp ~hiro/public/data/z500.mon.mean.* .
[/home/maro/data/%] grads -l
ga-> open z500.mon.mean.ctl # .ctlを略してもOK
ga-> q file # q dimsと打ってみても?
ga-> d z # display zでも同じです
ga-> quit
|
高度場の等値線図が描けました. 今度は, 極投影図法で, ベタ塗りに等値線を重ねてみます.
[/home/maro/data/%] grads -l
ga-> open z500.mon.mean.ctl
ga-> set mproj nps # デフォルトはmproj latlon
ga-> set lat 20 90 # 北緯20-90°までの領域を指定
ga-> set gxout shaded # デフォルトはgxout contour
ga-> d z
ga-> set gxout contour
ga-> d z
ga->
|
画面上にはこんな図が出ていると思います.
単なる同心円みたいでつまらないので,
ちょっと気象風味に定常波を描きましょう. ついでにタイトルもいれます.
[/home/maro/data/%] grads -l
ga-> c # 画面のクリア(clearと打っても同じ)
ga-> define zm=ave(z,lon=0,lon=360,-b) # 東西平均量zmを定義する(defineはなくても可)
ga-> set gxout shaded
ga-> d z-zm # 定常波成分(東西平均からのずれ)をプロット
ga-> set gxout contour
ga-> d z-zm
ga-> draw title Z500 Stationary Waves, Jan1948
ga->
|
こんな図ができましたか?
1.3 GrADSのサポートするデータ形式 |
- (普通の)GrADS形式
GrADSがサポートするデータ形式はいくつもありますが, 最も一般的なのが
書式なし, 直接アクセスのバイナリ形式です. Fortranでこの形式の
データを読む場合には, 次のようなOPENステートメントで開きます.
ここでcfinはキャラクタ宣言を
open( 10, file=cfin, form='unformatted',
& access='direct', recl=4*imax*jmax )
|
してあるデータファイル名(上の例では
'/home/hiro/public/data/z500.mon.mean.grd'),
imaxとjmaxは各々経度・緯度方向の格子数(GrADS上で
q fileと入力したときにXsize, Ysizeとして出てきます)
です. 直接アクセスですから, 正しいレコード長を指定しないと
正しくデータが読めません. また, READ文では読むレコードを
指定する必要があります.
GrADSは書式なし, 逐次アクセスのバイナリ形式も読むことができます.
自分でGrADSデータを作成する際には, 場合によって(あるいは好みによって)
二つの形式を使い分けてもよいかもしれません. 逐次アクセスの
データはこのように開くことが
open( 10, file=cfin, form='unformatted' )
|
できます.
あ, ちなみにGrADSで見られるのは単精度実数のデータのみです. ご注意を.
データの内部表現については, ここでもう少し詳しく解説されています.
- GRIB
GRIB (GRIdded Binary)は格子化された気象データに関するWMOの正式フォーマットで
現業気象機関の多くが予報データ, 解析データなどの保存・配布用に採用している.
GRIBはその圧縮性の高さに特徴があり, 通常のバイナリデータであれば1/2〜1/3
の大きさになる. ファイルは自己記述式(データの頭にヘッダがついている)である.
ファイルには.grbという拡張子がつくこともあるが, 必ずしも決まっていない.
GRIBデータをGrADSで開くためには, データファイル, .ctlファイルの他に
インデックスファイル(.idx)が必要である.
- Net CDF
net CDF (network Common Data Form)は, アメリカ大気科学大学連合(UCAR)が
主催するプログラム
UniDataで提案されているデータ形式. 可搬性(つまり転送が楽になるように
データを圧縮する)よりも普遍性(endianなどと独立にどこのシステムでも読める)を
重視している. GRIB同様に自己記述式で, GrADSは
この形式をサポートしている(開発元が同じアメリカの気象関係組織だから
まぁ当然ですね). 一般に, net CDF形式のファイルは.ncという拡張子がつくことが
多い. net CDF化するためのソフトもfreeで公開されているがここでは立ち入らない.
- HDF-SDS
HDF (Hierarchical Data Format)は地球科学に限らず, 大量データを扱う
計算科学に共通のフォーマットです. 元締めはNetscapeなどでご存知
NCSAですが, SDSというのは
Scientific Data Setsの略らしい. やはり圧縮性のある自己記述形式で,
リモセンなどではHDF形式のデータをよく扱うようですが, 大気海洋分野の
データでHDFにしているのはあまり聞きません(私もよく知らない ^^;).
1.4 .ctlファイルの読み方 |
GrADSデータを制御する小さなテキストファイルが, .ctlファイルと
呼ばれるもので, GRIBやnet CDFなどの自己記述式データ以外は
必ずデータファイルとセットになっています. 逆に, .ctlファイルなしで
普通のバイナリGrADSデータがあっても, 中身が何なのか,
どう読めばよいかは全く分かりません. 従って, .ctlファイルとデータファイルは
できるだけ同じ場所に置いておく, 自分でデータを作ったらまず.ctlファイルを
添える(そうしないとGrADS上で結果も確認できません)などを心がけましょう.
以下は, 上で使った500hPa高度場データの.ctlファイルです.
*
* NCEP/NCAR reanalysis during 1948-2002
*
DSET ^z500.mon.mean.grd
* BYTESWAPPED
* OPTIONS SEQUENTIAL YREV
TITLE monthly NCEP reanalysis
UNDEF -999.
XDEF 144 LINEAR 0. 2.5
YDEF 73 LINEAR -90. 2.5
ZDEF 1 LEVELS 500
TDEF 652 LINEAR 15JAN1948 1MO
VARS 1
z 0 99 geopotential height [m]
ENDVARS
|
では, 自己記述型のデータファイルはどうやってGrADSで開くのでしょう?
maroさんが, 今度はnet CDFの海面気圧データをとってきて
GrADSで絵を書いてみます. 違いはファイルを開くコマンドだけですね.
ただし, こうした自己記述型のファイルをFortranで読むには
専用のパッケージやコマンド群が必要になり, やや繁雑なので
ここでは解説しません. もし興味があるようならば, net CDFに
ついては
専攻内の手引, GRIBについてはコマンド
wgribのページなど
を参照してください(後述のfwriteで通常のバイナリに変換することもできる).
[/home/maro/data/%] cp ~hiro/public/data/slp.mon.mean.nc .
[/home/maro/data/%] grads -l
ga-> sdfopen slp.mon.mean.nc
ga-> q file
ga-> d slp
ga-> quit
|
[作業1]
maroが開いたnet CDFデータに対応するGrADSバイナリデータ
が/home/hiro/kiso/data/にslp.mon.mean.grdという名前で置いてあります.
net CDFのヘッダを見ながら自分でこのデータに対する.ctlファイルを
書き, 開いてみましょう.
1.5 いろいろな図を描く |
とりあえず図は描きましたが, GrADSではもっといろいろなことができます.
再び500hPa高度場データ(z500.mon.mean.grd)を例に
とってそれらを説明しますが, 高度場と海面気圧だけでは
面白くないので実際にGrADSで遊ぶ前に他のデータも使えるようにしましょう.
/home/hiro/public/data/にある次の5つの.ctlファイルを, 自分の
ホーム以下の適当なディレクトリにコピーします(:以下はデータの説明).
precip.mon.mean.ctl :CMAP月平均降水量
sst.mon.mean.ctl :Reynold's月平均海面水温
usfc.mon.mean.ctl :NCEP/NCAR再解析 月平均地表(海面)東西風
vsfc.mon.mean.ctl :NCEP/NCAR再解析 月平均地表(海面)南北風
uwnd.mon.mean.ctl :NCEP/NCAR再解析 月平均東西風(17気圧レベル)
また, カラーバー表示用のGrADSスクリプトをコピーします.
[/home/maro/data/%] cp ~hiro/public/gs/* .
- データ処理
- 演算
GrADSでは加減乗除の演算(+-*/)だけでなく, sqrt, log, exp, abs, sin, cosなどの
組み込み関数も使用できます.
- 時間平均
ga-> define zave1=ave(z,t=1,t=12) # 1948年の平均
ga-> define zave2=ave(z,time=jan1948,time=dec1948) # これでも同じ
|
- 空間平均
ga-> define zave1=ave(z,lon=0,lon=120) # 東経0-120°の経度平均(x=で指定も可)
ga-> define zave2=ave(z,lat=-90,lat=90) # 全緯度平均(y=で指定も可)
ga-> define zave3=aave(z,lon=0,lon=360,lat=-90,lat=90)
# 全球平均(x=, y=で指定も可)
|
[作業2]
uwnd.mon.mean.grdを開いて, 1948年1月の東西平均東西風を描いてみましょう
- 気候値
ga-> set t 1 12 # 12ヵ月分の時間配列をとる
ga-> define zclm=ave(z,t+0,t=652,1yr) # 気候値
ga-> modify zclm seasonal # T > 12でも周期的に値が入る
ga-> set t 1 60 # 5年分の
ga-> d z-zclm # 偏差を描画(アニメーション)
|
- ファイルへの出力
ga-> set t 1
ga-> set z 1
ga-> set x 1 144 # 経度はlonでなくxで指定しないとダメ
ga-> set y 1 73 # 同様
ga-> set gxout fwrite
ga-> set fwrite hogehoge.grd # ファイル名を指定
ga-> d z # ファイルに書き出し
ga-> disable fwrite
|
- 図化
- アニメーション
ga-> set t 1 12
ga-> d z # 1年分の高度場アニメーション
|
- 縦長の図を描きたい
[/home/maro/data/%] grads -p # オプションはl,p,b,c
|
- 時系列
ga-> set time jan1960 dec2000 # 1960-2000年まで
ga-> set lon 135 # 東経135°を選択
ga-> set lat 40 # 緯度40°を選択
ga-> set line 3 1 8 # 線の色・スタイル・太さを設定
# デフォルトでは次の16色
# 0:black, 1:white, 2:red, 3:green, 4:blue, 5:cyan
# 6:magenta, 7:yellow, 8:orange, 9:purple, 10:yellow/green
# 11:med.blue, 12:dark yellow, 13:aqua, 14:dark purple, 15:grey
# スタイルは1〜5, 太さは1〜9
ga-> set cmark 0 # 線中の記号を選択
ga-> d z # 折れ線で時系列を描画
|
- ベタ塗りの色と範囲を指定したい
ga-> set clevs 1000 2000 # 色の境界を設定
ga-> set ccols 0 5 4 # 各範囲の描画色を指定
# デフォルトではレインボーで, 次の並び
# set ccols 9 14 4 11 5 13 3 10 7 12 8 2 6
|
- x-z断面, x-t断面(Hovmollor), y-z断面など
ga-> reinit # 初期化
ga-> open uwnd.mon.mean.ctl # 気圧レベルの東西風データを開く
ga-> set z 8 # 300hPaを選択
ga-> set t 1
ga-> d uwnd # Jetの位置を確認
ga-> set lat 35 # Pacific Jetの中心緯度
ga-> set z 1 17 # 1000〜10hPa
ga-> d uwnd # 東西風x-z断面
ga-> c
ga-> set lat -90 90 # 緯度範囲リセット
ga-> set x 1 # 経度平均の準備
ga-> set zlog on # 鉛直座標を対数にする
ga-> d ave(uwnd,lon=0,lon=360,-b) # 東西平均東西風(y-z断面)
ga-> c
ga-> set lon 0 360 # 経度範囲リセット
ga-> set lat 35 # 再び北緯35°を指定
ga-> set t 1 12 #
ga-> define uclm=ave(uwnd,t+0,t=652,1yr)# 気候値
ga-> modify uclm seasonal # T > 12でも周期的に値が入る
ga-> set time jan1980 dec1989 #
ga-> set gxout shaded # ベタ塗り指定
ga-> d uwnd-uclm # 1980-1989の東西風偏差
|
- ベクトル図
ga-> reinit # 初期化
ga-> open usfc.mon.mean.ctl # 地表東西風
ga-> open vsfc.mon.mean.ctl # 地表南北風
ga-> set z 1
ga-> set t 1
ga-> set gxout vector # ベクトル描画指定
ga-> set arrlab on # 単位矢印の表示をさせる
ga-> d usfc;skip(vsfc.2,3,3) # x,y各3格子飛びでベクトル描画
|
- 散布図
ga-> set c
ga-> set gxout scatter # 散布図指定
ga-> d usfc;vsfc.2 # x軸東西風,y軸南北風で散布図
ga-> set lat -30 30 # 熱帯だけ選択
ga-> set ccolor 4 # 点の色を指定(青)
ga-> d usfc;vsfc.2 # 重ねて表示
|
- カラーバーとそのカスタマイズ (run cbar.gs/run cmap.gs)
[/home/maro/data/%] cp ~hiro/public/gs/* . # 必要なファイルをコピー(一度だけ)
[/home/maro/data/%] grads -l
ga-> set gxout shaded # ベタ塗り
ga-> d z
ga-> run cbar.gs # カラーバーが出ます
# 他のカラーバー(cbarn.gs, cbarc.gs)も試すと楽しい
ga-> reinit
ga-> run cmap.gs # カスタムのカラーバー作成
Enter Number of Colors:
10 # とりあえず10色
# いろいろ作ってsaveすると, grads.gctというファイルができる
# 作った1〜10番の色は, ccolor, ccols指定では21番からになる
# カスタムカラーを使うときには, 描画前に次の一文が必要
ga-> run colortab.gs grads # gctファイル名がusr.gctならば最後はusr
|
- 画面の分割
ga-> set vpage 0. 11. 0. 8.5 # バーチャルウィンドウの設定
# 横長の画面はデフォルト 0. 11. 0. 8.5 (越えてはいけない)
# 縦長の画面はデフォルト 0. 8.5 0. 11. (越えてはいけない)
ga-> set parea 0.5 5.5 0.5 8. # 描画領域の設定(左半分)
ga-> set parea 5.5 10.5 0.5 8. # 描画領域の設定(右半分)
# parea未設定時はvpage一杯に描画される
# vpageを変えて複数の描画をしてもOK
|
- ラベル・文字列の入力
ga-> d z(t=100) # とりあえず何か絵を描きます
# 以下は文字列の簡単な入力
ga-> draw title hogehoge # タイトル
ga-> draw xlab hogehoge # x軸のラベル
ga-> draw ylab hogehoge # y軸のラベル
# 以下は文字列のプリミティブな入力
ga-> set font 1 # フォントをセット(0〜5)
ga-> set strsiz 0.15 # 文字のサイズ
ga-> set string 2 bl 6 90 # 文字の色・太さ・回転(デフォルトは1 bl 3 0)
ga-> draw string 1. 5. hogehoge # 文字列を書く(数字はx,y座標)
ga-> draw string 1. 7. `2hoge`0hoge # 途中でフォントを変える
|
- 図の出力・印刷
ga-> reinit # 初期化
ga-> open z500.mon.mean.ctl
ga-> d z
ga-> enable print hoge.gm # ファイル出力許可
# GrADSからの一次出力はGrADSメタファイル(.gm)と呼ばれる
ga-> print # 出力
ga-> disable print # 出力終了
ga-> !gxps -i hoge.gm -o hoge.ps -c # gm->ps変換
# -cなしだとモノクロになる
# 白黒だけは自動的に入れ替わる(背景は白くなる)
# 画面と同一のpsにするときは-rをつける(黒ベタの図はあまり印刷しないこと)
ga-> !lpr hoge.ps # psをプリンタへ
# 最後の2行は, GrADSを抜けてからでもOK
# psはghostviewなどで見ることもできます
|
[作業3]
これまでのコマンドを組み合わせて図を描き, 印刷してみましょう
1.6 便利なスクリプト |
以上のコマンドを組み合わせれば, 思い通りの作図作業ができます.
しかし, 細かく設定するとGrADSプロンプトから入力するコマンドも
多くなりますから, いちいち何度も打つのが面倒になってきますね.
それを解消してくれるのがスクリプトです.
- exec
- execファイルは実にカンタン, GrADSコマンドをひたすら書き並べただけの
テキストファイルです. 拡張子は何でもOK(ただ自分なりに統一しておく方が
ベターです). 覚えておくべき規則は2つだけ.
- コメントは行頭に*をつける
- Unixコマンドは!lsのように!を頭につける
- 実行はga-> exec hogehoge.execです. 気に入らない, うまく描けないなど
でやり直したければ, ga-> reinitとしてから再度実行します.
- サンプルのexecファイルcmap.execを
使うと, こんな図が描けます.
- gs
- gsはGrADS Scriptの略(GhostScriptではありませんぞ)で, execではできない繰り返し, 条件判定, 引数つき実行などが行えるスクリプトです. cshなどをやったことがあれば難しくはありません. 拡張子は普通.gsを使います. execファイルの規則に加えて
いろいろ書き方のマナーありますが, 主なものを挙げると
- 実行はga-> run hogehoge.gs, もしくはgrads -lc "hogehoge.gs"などとするとGrADSプロンプト抜きで即gsが起動されます.
- サンプルのgsファイルsample.gsは,
画面から年を入力して海面気圧のアニメーション(1年分)を表示するスクリプトです.
[作業4]
自分でexecファイルを作って実行してみましょう
[作業5]
sample.gsを編集して実行可能なgsファイルを作ってみましょう
[作業6]
使えるデータ(用意したものでもいいし, 自分でどこかからとってきたものでもOK)
で何か1〜2枚, 気象学・海洋学的に意味のある図をexecもしくはgsを使って
描いてみて, そこから何が言えるかを考えてみましょう.
[作業X]
さきほどプロットした500hPa高度場のデータは, 書式なし直接アクセスファイルです.
fortran演習を思い出してこのデータを読むプログラムを書いてみましょう.
[作業Y]
周期2年で鉛直伝播する波を作り, GrADSでt-z断面図を書いてみましょう. ただし,
簡単のためデータの時間間隔は月とします.
前のページに戻る
大気海洋圏環境科学専攻ページに戻る
Last modified: Mon Jun 9 16:12:13 JST 2003