4 内部動作

GAVE の一連の動作の流れを図4 のように表した.

ユーザーは GAVE を起動後, まずファイルを開く(1. ファイルオープン). この段階でファイル内に含まれる変数が GAVE に読み込まれる. ファイルは複数の変数を持つ場合がある. そのためまず操作対象とする変数を選択する(2. 変数選択). そして実行したい動作を選択し(3. 動作選択), 動作に使用する次元変数を選択する(4. 次元変数選択). この 2〜4 ではそれぞれで行った選択が次の選択肢を決定するため順番に行う必要がある. その後, 動作を実行(6. 動作実行)するのだが, その前に描画範囲の選択や地図投影法の選択などの設定(5. 各種設定)を行うこともできる. 3 で解析を選択した場合は 6 の動作実行で解析(データに対する演算)が行われその結果は新しく変数として生成される. この変数を 2 で選択するとこの解析結果を描画したり更に解析したりすることができる. 6 で描画を行った場合は描画結果の絵が生成される. この絵に修正を加える場合は 5 に戻り修正のための設定を行う. または 2〜4 に戻り変数の選択などからやり直すこともできる. 実際に GAVE で可視化を行う際は 2〜6 を対話的に繰り返し実行することによって意図するデータの特徴をより明確に表現する. 描画結果に満足した場合, 結果を保存(7. 保存)することができる. 保存には画像として保存するか Ruby スクリプトとして保存するかの2通りがある. GAVE の機能ではないが Ruby スクリプトとして保存した場合はデータファイルとともにこの Ruby スクリプトを実行(8. Ruby スクリプトの実行)することで可視化を再現することができる.

GAVE が利用している電脳 Ruby プロジェクトのライブラリはおおよそ図の橙, 桃, 青の点線で囲まれた部分に対応する. データの読込の機能に Ruby/NetCDF[7] ライブラリ, 描画機能に Ruby/DCL[5] ライブラリ, 解析機能に GPhys[6] ライブラリを用いている. Ruby/NetCDF ライブラリは Unidata から提供されている netCDF ライブラリの Ruby 用インターフェースであり, Ruby/DCL は地球流体電脳倶楽部で開発されている描画・数値処理ライブラリである DCL ライブラリの Ruby 用インターフェースである. また GPhys は電脳 Ruby プロジェクトで開発されている多次元物理量クラスのためのライブラリである. それぞれの詳細については付録C を参考にしてほしい.

GAVE 内部動作

図4: GAVEの内部動作の概略

Ruby スクリプトには GAVE が内部で可視化までに行っている一連の動作が記述されている. このスクリプトを見れば GAVE の内部で何が行われているかについてより具体的に知ることができる. 以下に ECMWF/ERA40 再解析データから 2001年8月の温度を可視化した際の例を用いて GAVE の内部動作をより詳細に解説する. この例で用いるデータは ECMWF/ERA40 再解析データから日単位の 2001年8月の温度データを入手し、更にそれを月平均したデータを用いてる. ファイル名は T_2001-08_ERA40.nc, 変数は温度 t , 次元変数として緯度 longitude (degree north), 経度 latitude (degree east), 高度 levelist (millibars)の3次元を持つ. 解説の都合上いくつかに分割しているが以下のスクリプトは 1つのファイルである.

 1: require "gtk2"
 2: require "numru/gphys"
 3: require "numru/dcl"
 4: require "numru/netcdf"
 5:
 6: include NumRu

ここまでは各ライブラリを使用するための記述である.


 7: filename = "/home/takemoto/NC/T_2001-08_ERA40.nc"
 8: varname = "t"
 9:
10: gphys = GPhys::netCDF_IO.open(filename,varname)

このスクリプトではファイル名と描画する変数名を決めてファイルからその変数だけを呼び出している. しかし, GAVE でははじめから変数を指定してファイルを開いているわけではない. ファイルを開いてから図4 の 2. 変数選択で変数を選び, それから再びファイルにアクセスし指示された変数を読み込む.


11: gphys = gphys.cut(0.0..357.5,true,true)
12: gphys = gphys.mean(0)
13: gphys = gphys[0..-1,0..-1]

12行目で次元変数 longitude(緯度) で平均演算している. これは図4の 3. 動作選択で平均を選択し, 4. 次元変数選択で longitude を選択したことが記述されている. 新しくできた変数は, 2. 変数選択で選択する.


14: DCL::gropn(1)
15:
16: DCL::sglset("LCNTL", false )
17: DCL::udlset("LMSG", false )

これは描画のための初期化である.


18: xmin = 90.0
19: xmax = -90.0
20: ymin = 1000.0
21: ymax = 1.0
22:
23: vxmin = 0.15
24: vxmax = 0.4775
25: vymin = 0.1675
26: vymax = 0.84
27:
28: DCL::grfrm
29: DCL::grswnd(xmin,xmax,ymin,ymax)
30: DCL::grsvpt(vxmin,vxmax,vymin,vymax)
31: DCL::grstrn(2)
32: DCL::grstrf
33:
34: x_title = "latitude"
35: x_unit = "degrees_north"
36: y_title = "levelist"
37: y_unit = "millibars"

18〜21行目は描画範囲の指定, 23〜26行目は軸を含む矩形領域(これをビューポートという)の位置とサイズの設定をしている. 34〜37行目はX軸, Y軸のタイトルと単位の設定している. 軸を含む矩形領域の位置設定は一度描画してから設定するのであるが, これら全て図4の 5. 各種設定にあたる.


38: DCL::sglset("LCLIP", true )
39: DCL::uwsgxa(gphys.coord(0).val)
40: DCL::uwsgya(gphys.coord(1).val)
41: DCL::ueitlv
42: DCL::uegtla(-26783.916015625, 21480.806640625, 0 )
43: DCL::uetone(gphys.val)
44: DCL::udgcla(-26783.916015625, 21480.806640625, 0 )
45: DCL::udcntz(gphys.val)
46:
47: DCL::ussttl(x_title, x_unit, y_title, y_unit)
48: DCL::usdaxs
49: DCL::sglset("LCLIP", false )
50: i=0
51: DCL::sgtxzv(vxmax+0.01,vymax-0.03*i,"(mean) longitude:0..357.5",0.02,0,-1,1)52:
53: DCL::uzrset("ROFFXT", 0.06)
54: title = "Temperature(K)"
60: DCL::uxsttl("t", title, 0 )

これが描画を実行している部分である. 図4の 6. 動作実行から絵が描画されるまでの流れである. ただ54,55行目はタイトルを設定している部分であり, これは図4の 5.各種設定に該当する.

61: DCL::grcls

これは描画したウィンドウを消す命令であるが, GAVE を用いて描画を行っている際はには関係ない部分である.


GAVE 上のクリックや入力などの操作がすべて1対1の関係でスクリプトを作成するわけではないが, GAVE の内部ではおおよそこのような動作をしている.