個人的なメモ書きです。別の(楽な)方法があればぜひ教えてください。誤りなどの指摘もよろしくお願いします。
ご存知のことがあれば、コメントしてくださいm(_ _)m
stnaave(stnvar1-stnvar2,lon=x1,lon=x2,lat=y1,lat=y2)できたら便利ですよねえ。(注意:上のコマンドは空想のものです。) -- kei 2008-07-16 (Wed) 17:59:23
#comment2_kcaptcha
setenv GADDIR /home/kei/GrADS/lib setenv GASCRP /home/kei/GrADS/lib setenv GAUDFT /home/kei/GrADS/udft
set gxout outputtype
d u;v d skip(u,2,2);skip(v,2,2) # 間引き
d var1*var2
d ave(var,t=1,t=24) # ネスティングも可能
d vint(sfcprs(hPa),expr,end pressure (hPa)) d vint(pressfc/100,spfhprs, 10) # 例
d hdivg(xexpr,yexpr)
set dfile num
空間や時間解像度の異なる異なるctlファイルをデフォルトに選んだ後lonlatを指定し直せば、図化できるようになる。
d maskout(var,var-10) # 10以上の値を表示
set display color white
set black -0.2 0.2 # -0.2から0.2は塗らない
run cbar # fg,bgなし run cbarn # fg,bgあり
run cbarn 大きさ 水平0/鉛直1 x位置 y位置
draw title zs draw xlab (ylab) xxxxx
enable print hoge.gx print disable print ! gxps -c -i hoge.gx -o hoge.ps # -c -rで黒背景。
追記:printimというコマンドを使えば一発(スクリーンショットの取り込み)。
printim tmp.gif gif white
さらに追記:print XXX.epsとすると、自動的に上記の作業をやってくれる。-Rオプションをつけると正常な向きになる。
print -R foo.eps
set fwrite xxx.dat set gxout fwrite set x (y,z,t, etc.) x1 x2 ここで、xを設定しなおさないと、なぜかxmax+1まで保存されてしまう。 時系列に保存したい場合は>set t t1 t2 など。 d var disable fwrite
In GrADS,
> d -vvelprs*287*(tmpprs+0.61*spfhprs)/lev/100/9.8
In GrADS,
> d lev*100/287/(tmpprs+0.61*spfhprs)
ちなみに気温0℃、気圧1000hPaでの空気密度は1.275(kg/m3)。
In GrADS,
> d prmslmsl*pow((tmpprs-0.0065*hgtsfc)/tmpprs,9.8/287/0.0065)
誤差があることに注意。
function main(args)をスクリプトの頭で定義する。
(example) function main(args) var1=subwrd(args,1) var2=subwrd(args,2) ...
set gxout print set prnopts %10.3e 1 1 # 小数点以下3桁、一列に表示、ブランクは一文字分
画面に出たものをファイルに保存するやり方がわからん!コピペするしかないのか??スクリプトなら何とかなりそうだけど。。。
結局、fwriteでバイナリ出力したものをテキストでファイルに書き出すコードを作った。./textout
<追加情報>
*NCEP/NCARの再解析からあるグリッドのデータをテキスト形式 *で縦一列に書き出す方法 'sdfopen hgt.1993.nc' 'set lat 30' 'set lon 125' 'set t 1 365' 'set lev 200' 'set gxout print' 'set prnopts %7.2f 1 1' 'd hgt' rc=write(hgt.1993.30N125E.asci,result) rc=close(hgt.1993.30N125E.ascii) これで、200hPa,30N,125Eの高度場の値がhgt.1993.30N125E.asciiと いうファイルに書き込まれます。ヘッダーが1行入ってしまいますが..... (by 藤波さん@HyARC)
cbar_l -t "line1" "line2" "line3" -pで、画面のクリックした位置にレジェンドを付加できる。線種をカスタマイズしたいときは
cbar_line -c 色 -m マーカ -l ライン -t "テキスト" -pとして、各項目に番号を振る。ちなみにGrADS標準は下記の通り。
Num | Color | Line | Mark |
1 | 1 | 1 | 2 |
2 | 3 | 1 | 3 |
3 | 7 | 1 | 4 |
4 | 2 | 1 | 5 |
5 | 6 | 1 | 1 |
6 | 9 | 1 | 2 |
7 | 10 | 1 | 3 |
8 | 11 | 1 | 4 |
9 | 12 | 1 | 5 |
10 | 15 | 1 | 1 |
普通に
set t 1 10 d var
でできるが、コマ送りが早すぎなどという問題点がある。ftp://grads.iges.org/grads/scripts/xanim.gs を使うとさらに便利。
set t 1 10 # 同じ xanim -pause -grfill var # マウスクリックでコマ送り(かつgrfillで表示) xanim -skip 4 -repeat 5 var # 4コマ目ごと、5回繰り返し
など。オプションは変数より前にないとダメらしい。
page.gs (ftp://ftp.cpc.ncep.noaa.gov/wd51we/grads/page.gs)が使える。
page q1 # 右上 d var1 page q2 # 左上 d var2
という具合。元に戻すには
page reset
set t 1 100 # 例えば。 define a=ave(var,t-0,t+9) # 前方10個平均。define省略可。第二引数はtだけだとダメ。 set missconn on # 欠損は無視してつなぐ。 d skip(a,10)
set t 1 100 define a=aave(var,lon=-180,lon=180,lat=-90,lat=90) # 面積重みつき全球平均 set x 1 # Lineを書くため、Xを固定(値は何でも良い) d a
追記:tloopを使うとdefineする必要はない。
set x 1 set y 1 d tloop(aave(var,lon=-180,lon=180,lat=-90,lat=90)
set gxout stat d var 欠損値の数や和、標準偏差、分散などが表示される。 sublin, subwrdなどで取り出して使用することが多い。
ある時間軸一次元のデータの、領域全体の時系列変化に対する相関係数を計算する。
set t 1 100 define tmp=aave(var,lon=-180,lon=180,lat=-90,lat=90) set t 1 d tcorr(tmp,var,t=1,t=100) # 全球平均値tmpの変動に対しての、全グリッドの時間変動の相関を表示
同領域2変数の空間相関係数を計算する。
d scorr(var1,var2,lon=-180,lon=180,lat=-90,lat=90) # var1とvar2の全球空間分布の一致度(相関)を表示
同様に、回帰直線の傾きは以下のようにして求められる。
d sregr(var1,var2,lon=-180,lon=180,lat=-90,lat=90)
これらを利用して、散布図に回帰直線を引きたい場合は、
slp=sregr(var1,var2,globe) av1=aave(var1,globe) av2=aave(var2,globe) int=slp*-av1+av2 d var1;slp*var1+int
という感じでできる。
GrADSには、Z軸に関してのみ対数軸が用意されている(set zlog on)が、X,Yに関しては存在しないため少々面倒。
対策は2通りある。ひとつは散布図(set gxout scatter)を使う方法、もうひとつは対数で描画したい横軸をZ軸としてデータ及びctlファイルを作成しset xyrev on/set zlog onを使う方法。前者は簡単だが点と点を結ぶ線を引けない。後者はデータを作り直さなければならず少し厄介だが、きれいな図が描ける。
set gxout scatter set vrange X1 X2 #通常の線グラフならY軸に対応するが、散布図ではX軸 set vrange2 Y1 Y2 set digsiz 0.1 #デフォルトの点は若干小さいので大きくする。 d log10(lon);log10(var)
set x 1 #(実際は)高度を指定 set z 1 300 #両対数グラフのX軸とするべき軸の範囲を指定 set zlog on #Z軸を対数表示 set xyrev on #描画領域のXYを入れ替え set xlevs 1 2 5 10 20 50 100 200 300 #X軸のアノテーションを指定(指定ナシも可) set cmark 0 #マークを描かない set cthick 6 #線を太く。 d log10(var) #変数varを対数表示。
Diurnal PatternやSeasonal Climatologyを算出するにはaveに時間ステップを指定してそれぞれの平均を取ると良い。
set t 1 4 # tを日変化なら4ステップというように適当に設定。 set x 1 set y 1 # tloop用。 d tloop(ave(aave(var,lon=X1,lon=X2,lat=Y1,lat=Y2),t-0,t+120,4)) # ミソはaveの設定。はじめに設定したt=1,4のそれぞれから4つ飛び # で平均を取る。
あーラクチンだねー。
追記
上記は要はClimatologyを計算していることに他ならない。それを用いてAnomalyを求めたいときは、
define xxx=ave(var,t-0,t+120,12) modify xxx seasonal (もしくはdiurnal)
とする。
vpageを使う。ただ、位置などの微調整が難しい。
# 現在の座標情報を得る(あくまでも目安) q gxinfo # gxinfoの情報を元に、背景色の四角を書く(透けるのを避けるため) # 次のvpageの座標と同じにしても良いが、余白を少なくするには微調整が必要。 set line 0 draw recf xlo ylo xhi yhi # 続いてvpageを設定。良い位置にするにはかなり細かい調整が必要。 set vpage xlo xhi ylo yhi # X-Yラベルのフォントサイズを変更(そのままでは縮小される) # デフォルトが 色番号=1、太さ=4、大きさ=0.12 らしいので、参考にする。 set xlopts 1 2 0.3 set ylopts 1 2 0.3 # gradsのロゴなどをはずす set grads off そして普段どおり描く。塗りつぶしの図なんかの場合は背景の四角はいらないね。 vpage以前の設定は持ち越されないので注意。
rec=read(filename) var1=sublin(rec,2) rec=close(filename)
などと記述すると、recという変数の一行目にfilenameというファイルのステータスが入り、2行目以降にファイルの内容が取り込まれる。その中から変数を引き込みたいときは、sublin, subwrdを用いる。(上記の例だとfilenameというファイルの一行目がvar1という変数として引かれている)
80行までの小さなASCIIファイルを読み込める。この機能を使うと、GrADS外のコマンドとの引数受け渡しがある程度可能になる。読み終わったファイルはcloseが必要。
関連:テキストファイルの出力
スクリプトやコマンドラインにおいて、びっくりマークから始めると外部コマンドを呼び出せる。リダイレクトも使える。スクリプトで使用する際に、$や”をそのまま用いたい場合は、\(バックスラッシュor¥マーク)でエスケープしてあげる必要がある。以下、awkの例。
tt=1 '! awk "NR=='tt+1'{printf(\"%4.1f\n\",\$3}" ./slpanm_eval.txt > tmp.txt'
d lterp(var1.1,var2.2) # var1.1: 内挿前 var2.2: 内挿先 d lterp(var1.1,var2.2)-var2.2 # などという演算が可能となる。楽。
'reinit' 'open /home/kyoshimura/IsoRSM/cal10km/200702/r_pgb_prs.ctl' 'set grads off' 'set zlog on' 'set x 1' 'set y 1' 'set lev 1000 200' lon1 = -123.22 lon2 = -120.82 lat1 = 38.61 lat2 = 39.20 lon = lon1 'collect 1 free' while (lon <= lon2) lat = lat1 + (lat2-lat1)*(lon-lon1) / (lon2-lon1) 'collect 1 gr2stn(pwat,'lon','lat')' lon = lon + 0.1 endwhile 'set x 14 16' 'set xaxis 'lon1' 'lon2 'set clab on' 'set gxout shaded' 'd coll2gr(1,-u)' 'run cbarn'
set z 1 10 define tmp=pressfc # 全層に表面気圧を入れるなどとやってから、 数多くの正値の太いコンターでd lev-tmp/100を表示させる。
set clevs 0 5 10 15... # コンターの間に空白がなくなるように、必要なだけ延々と書く。 set ccolor 15 # 灰色 set cthick 6 # 太いほうが良い set clab off # コンターラベルはなし d -(tmp/100-lev) # 描画
hdivgとhcurlをつかって、スカラー量qのdq/dx、dq/dy及びラプラシアン(d2q/dx2+d2q/dy2)を計算できる。簡単にできるスクリプトはこちら。
大変親切なことに、UCLAのMunnichさんの手によってeofgradsというとっても便利なツールがある。これが非常に便利。多謝。 http://www.atmos.ucla.edu/~munnich/Grads/EOF/
> set x 1 144 > eof expressionで、expres_eof.ctl/datというファイルとexpres_pc.ctl/datというファイルが生成され、それぞれ固有ベクトル(EOF空間分布、Z方向に成分)と標準化時係数(T方向に時間)をあらわす。グローバルデータの場合、上記のようにxをグリッド数で再定義する必要がある。
別ページへIT memo/GrADS memo/Station data
別ページへIT memo/GrADS memo/GrADS2.0
See separate page IT memo/GrADS memo/OpenGrADS
'! rm -f hadley.dat' 'reinit' 'open /home/kyoshimura/IsoGSM1/pgb_mon-s1.ctl' tt=1 'set t 'tt 'set lon 0' 'zps=ave(pressfc/100,lon=-180,lon=180)' 'set z 1 17' 'zv=ave(vgrdprs,lon=-180,lon=180)' zz=2 while zz <= 17 'set z 'zz 'q dim' res=sublin(result,4) zlv=subwrd(res,6) 'set fwrite tmp.dat' 'set gxout fwrite' 'd (vint(zps,zv,10)-vint(zps,zv,'zlv'))*2*3.14*6.37e6*cos(lat*3.1415/180)' 'disable fwrite' '! cat tmp.dat >> hadley.dat' zz=zz+1 endwhile 'reinit' 'open hadley.ctl' 'set zlog on' 'set xlopts 1 3 0.16' 'set ylopts 1 3 0.16' 'set xflip on' 'set ylevs 900 700 500 300 150 100 70 40 20 10' 'set gxout shaded' 'set grads off' 'set clevs -300 -250 -200 -150 -120 -90 -60 -30 -10 10 30 60 90 120 150 200 250 300' 'rgbset2' 'd msf/1e9' 'set gxout contour' 'set clevs -300 -250 -200 -150 -120 -90 -60 -30 -10 10 30 60 90 120 150 200 250 300' 'set ccolor 1' 'd msf/1e9' 'draw ylab pressure (hPa)' 'draw title Meridional m.s.f. (10e9kg/s), IsoGSM' 'run cbarn'
dset ^hadley.dat options little_endian undef -999. xdef 1 linear 0.000 2.500 ydef 73 linear -90.000 2.500 zdef 16 levels 925 850 700 600 500 400 300 250 200 150 100 70 50 30 20 10 tdef 1 linear 00Z1JAN1979 1mo vars 1 msf 16 16 mass stream function endvars
sdfopen XXX.nc
するだけ。
簡素版コントロールファイルをつくってxdfopenする。
xdfopen test.ctl
SWINGデータ用のサンプル→&attachref(s1a.echam4.ctl);
DSET ^foo.nc # netcdfファイルを指定 UNDEF 1e20 # undef値を指定 XDEF xc # netcdfファイルのX軸変数を指定(lon, longitude, xcなど) YDEF yc # 同様にY軸(lat, latitude, ycなど) ZDEF plev # 同様にZ軸(plev, lev, heightなど)。無い場合は行自体削除。 TDEF time # 時間軸変数を指定。 VARS 1 # 変数の数 ta=>ta 25 25 ta # NCファイル内の変数の名前=>GrADSでの名前、レベル数 ENDVARSXDEF、TDEFなどで変数を指定した後、
XDEF xc 3 226.0 1.25 # 226度から1.25間隔で3点 YDEF yc 3 levels 10 11.25 12.5 #10, 11.25, 12.5度の3点などと指定することができる。
[2009/5/16 更新]
で触れられているように、gxepsやgxpsで作った図には変な横線が入ることがある。ベクトルデータの調査の結果、shadedの図では、上下に一グリッド分の細長いポリゴンをぺたぺた重ね塗りしているようで、上下のポリゴンになぜか隙間ができているのが原因の模様。はっきり言ってどうしようもない(多分)。
対策としては、
くらいかなあ。
<追加情報>
gimpでセーブしなおすと横線は消えるらしい。(by T.Yamada@GSFC)
<追加情報2>
の情報によると、アンチエイリアシングなるものの効果によるらしい。で、gsのアンチエイリアス用のオプションである
-dTextAlphaBits=n -dGraphicsAlphaBits=n
のnを両方1に(TextのほうはGrADSに関しては実質効かない)して画像ファイルに変換すれば、確かに不快な横線は消える。が、今度は文字が粗くなったり線の太さがバラバラになったりする。どっちをとるか、だね。
デフォルトでlib内にfont0.dat~font5.datが用意されている。font3.datが特殊文字。しかし、同位体屋に必須である「パーミル(‰)」が存在しない。よって自作を試みる。 われながら暇人だ。
font numberで一覧が表示される。デフォルトでは0-5。チルダ(~)がどのフォントでもまったく同じ文字に当てられている。
http://iges.org/grads/gadoc/font.htmlを参照。
fontX.datには、ASCIIコードの32(空白)~126番目(チルダ)の95のキーを入力したときに呼ばれる記号が、それぞれの行に記述されてある。つまり、あるキー(例えばチルダ)に対応する記号を変更したければ、その行(チルダの場合は95行目)を変更すればよい。
続いてフォントの中身を解読する。例えばスラッシュ(/:16行目)は
3G][BIb
とある。まずはじめの3は、3つの座標ペアが続く、という意味。座標というのは、ASCIIコードの順番でちょうど真ん中の「R」をゼロとして、若いキーがマイナス、後のキーがプラス、としている。よってGは-11、]は+11が当てられる。
はじめの数字の直後は、記号の幅を示す。つまりG]は-11~+11を占めるということ。
これ以降は、一筆書きなら座標を並べていき、間をおくなら「空白+R」でつなげる。よって例の場合は、[B(+9,-16)からIb(-9,+16)まで直線を引く、ということになる。
font3.datの最後の行(チルダ用)を以下のように変更する。
14F^IUISJPLONOOPPQTTVUXUZT[Q[O ↓ 44D`WFE[ RJFLHLJKLIMGMEKEIFGHFJFLGOHRHUGWF RSTQUPWPYR[T[VZWXWVUTST R[TYUXWXYZ[\[^Z_X_V]T[T
GrADS内では、「`3~」で呼び出す。例えば、
ga> draw ylab `3d`0`a18`nO [`3~`0]
で、『δ18O [‰]』(18は上付き)が表示される。
Modify the last line of gradsdir/lib/font3.dat as follows:
14F^IUISJPLONOOPPQTTVUXUZT[Q[O ↓ 44D`WFE[ RJFLHLJKLIMGMEKEIFGHFJFLGOHRHUGWF RSTQUPWPYR[T[VZWXWVUTST R[TYUXWXYZ[\[^Z_X_V]T[T
The permil symbol is written by "`3~", such as
ga> draw ylab `3d`0`a18`nO [`3~`0]
This writes "d18O [permil]" in Y-axis.
別項目へIT memo/GrADS memo/lats4d。
ave(var,t=1,t=10)*10 と sum(var,t=1,t=10) は同じではない!原因は欠損値の取り扱い(下記参照)。
sum(aave(var,lon=0,lon=360,lat=-90,lat=90),t=1,t=10) と aave(sum(var,t=1,t=10),lon=0,lon=360,lat=-90,lat=90) は異なる。後者が正解。
F=A*Bのとき (Fの平均)=(Aの平均)*(Bの平均)+(A及びBの偏差の共分散)。 相関が0のときは上の共分散もゼロ。共分散=(A,Bの相関)*(Aの標準偏差)*(Bの標準偏差)
F=A+Bのとき (Fの平均)=(Aの平均)+(Bの平均) or (A+Bの平均)
F=▽・(A,B)=∂A/∂x+∂B/∂yのとき (例えば収束) (Fの平均) = ∂(Aの平均)/∂x+∂(Bの平均)/∂y = (∂A/∂x+∂B/∂yの平均)
数学的には ∫(∂(q*u)/∂x)dp と ∂(∫(q*u)dp)/∂x (鉛直積分⇔水平微分) は同値だが、GrADSにおいては地表面付近の∂(q*u)/∂x がおかしくなるため (欠損があるため)、∂(∫(q*u)dp)/∂x (鉛直積分→水平微分)を使ったほうが良い。
変数同士の演算 → 全て欠損値を返す(要注意!) sum → 欠損値をゼロとして(欠損値を飛ばして)計算 ave → sumの結果を欠損値を除いた個数で割る。
変数同士の演算ですべて欠損値を返すため、 ave(var1,t=T1,t=T2)-ave(var2,t=T1,t=T2) と ave(var1-var2,t=T1,t=T2) は異なることがある。 ave(var1-var2,t=T1,t=T2) と等しくなるのは ave(maskout(var1,var2+1e30,t=T1,t=T2)-ave(maskout(var2,var1+1e30),t=T1,t=T2) である。1e30というのは、var1のとりうる範囲が-1e30以上、ってことにしているから。