多次元データの解析・可視化ソフトウェア GAVE

竹本 和彰
<takemoto@ep.sci.hokudai.ac.jp>

GAVE, a grid data analyser and viewer.

TAKEMOTO, Kazuaki

北海道大学理学部地球科学科地球物理学専攻
地球流体力学研究室 4年
2004年2月10日








要旨

GAVE は電脳 Ruby プロジェクトのもと, 地球流体科学分野での利用を想定して西澤によって開発された多次元データの解析・可視化ソフトウェアである.



1. はじめに

地球流体科学分野の研究手法として、データを可視化して解析する手法は重要な研究手法の1つである。例えば大気や海洋を研究するために、地球流体の研究者は衛星観測や数値シミュレーション等によって生成されるデータを解析する。このデータとは多次元の数値データである。データの表現方法として、折れ線図や等値線図などの2次元平面に表現する方法は人間にとって認識しやすい。多次元データの場合には、ある断面切り出して2次元平面に投影することによって可視化する。

近年、計算機やインターネットの発展によって多種多様のデータが多量に流通しており、これらを容易に利用することができる。計算機の計算速度が飛躍的に向上したため、これまでの計算速度では有限な時間内で扱うことができなかった数値計算ができるようになった。また、世界中に散らばる多様なグループや研究者が生成するデータをネットワーク経由で容易に入手することができるようになった。そして多量のデータを扱うことによって新しい発見につながるかもしれない。しかしデータが多種多様であるためにデータの扱いを効率よく行わなければ多量のデータを解析することはできない。

データを効率よく扱うための手法の1つとしてグラフィカルユーザーインターフェースで対話的に可視化する手法がある。多種多様なデータを可視化する場合、データごとに可視化したい断面はおそらく異なる。そうであればデータごとに切り出す断面を試行錯誤を繰り返す必要がある。この作業はバッチ処理のような手法よりも対話的に行う方が効率が良い。グラフィカルユーザーインターフェースであれば更にコマンドを入力する手間が省けるため、効率がよりよくなる可能性がある。

また、各々必要な機能を拡張するためにソフトウェアはソースが公開されかつ改変することが可能でなければならない。ソフトウェアに求める機能は研究対象によって異なる。例えばデータに対する演算において精度をどの程度求めるかは計算速度との兼ね合いがあるため多様である。このような要望は無限にあり1つのソフトウェアに全て実装することは困難である。したがって研究者が各々求める形にソフトウェアを改変することができなければ細かい要望は実現できないと思われる。

電脳 Ruby プロジェクト[3]では, 地球物理学におけるデータ解析, 可視化, 数値シミュレーションにオブジェクト指向スクリプト言語 Ruby[11] を使って活動を行っている. このプロジェクトでは地球流体関係者が解析・可視化のためのソフトウェアを開発している. Ruby を用いる理由は, オブジェクト指向というプログラムパラダイムを用いることによって、多様なデータを統一されたインターフェースから扱う設計にしやすいためである。またスクリプト言語ゆえに対話的なユーザーインターフェースを実装しやすいことなども理由の1つとしてあげられる.

電脳 Ruby プロジェクトによって開発された解析・可視化のためのライブラリを利用する GAVE[10](a gtk+ based grid data analyser and viewer writen on Ruby) という GUI の多次元データ解析・可視化ソフトウェアが開発されている. このソフトウェアは地球流体における多次元データの解析を効率良く行うためのソフトウェアである. 本論分ではこの GAVE についての紹介を行う.

以下, 第2章から第3章では GAVE の特徴と機能の概要を取り上げ GAVE がどのようなソフトウェアであるのか解説する. 第4章では GAVE の内部動作について触れる. また, 付録A として使用方法をまとめた. 付録B として電脳 Ruby プロジェクトについてまとめた. 付録C で GAVE が依存するライブラリをまとめた.

なお, 本論分で対象とする GAVE のバージョンは 1.0.0-beta4 である.

2 GAVE の特徴

GAVE は西澤によって開発されている多次元データ解析・可視化ソフトウェアであり, 電脳 Ruby プロジェクトで開発された解析・可視化のためのライブラリを統合的に利用することができるユーザーインターフェースである. 図1 は GAVE を使用して可視化を行っている際の画面である. また, 扱うことのできるデータ形式は netCDF[13] である. バージョン 1.0.0-beta5 では GrADS のデータ形式も扱えるようになっている.

GAVE を使用中の画面

図1: GAVE を使用中の画面

以下では GAVE の特徴を次の3つに分類し説明する。

GUI であること

GAVE のユーザーインターフェースは GUI である. GUI の長所は手軽で対話的な操作性である. 対話的な操作によって描画した絵に対して逐次修正を加えることができるため, データが持つ特徴をより明確に表現することが可能になるだろう. また, GUI は視覚的に機能を理解することができるためキャラクターユーザーインターフェース(以下 CUI) のソフトウェアようにコマンドを覚える必要がない。そのため, 初めてそのソフトウェアを使用する人であっても直感的に機能を把握することができる。よってソフトウェアを習得するまでに長い時間を要さない. また、GAVE の GUI は日本語に対応している. 英語が母国語としない日本人にとって日本語のユーザーインターフェースを持っていることは機能の把握を楽にする.

バッチ処理やルーチンワーク, または可視化を再現することを考えると, 一般に GUI は CUI に劣る. しかし GAVE はこの点を解消する機能を持っている. その機能とは可視化を再現するスクリプトをファイルに保存することができるという機能である. このスクリプトは Ruby スクリプトであり, このスクリプトとデータから可視化を再現することができる. またこのスクリプトを雛形として各々必要に応じて修正すれば, 様々な工夫ができる. 例えば GAVE が未実装の機能を実現したい場合はスクリプトを修正することで解決する. また, この雛形をループ(繰り返し構造)に閉じ込めファイルを順次与えるような処理を記述すれば, 複数のファイルに同様の処理を行うスクリプトを簡単に書くことができる.

ソースが公開され改変可能であること・無償であること

電脳 Ruby プロジェクトの製品は基本的にソースが公開され、改変することも可能である。GAVE も電脳 Ruby プロジェクトの製品であるため同様のことが言える。商用のソフトウェアなどソースが公開されていないソフトウェアにおいて、そのソフトウェアに実装されていない機能が必要である場合は、開発が進むのを待つかあきらめるしかない。GAVE はソースを自由に改変することができるため自分で拡張することが可能である。例えば GAVE は現在, GAVE が利用するライブラリの機能の全てを使えるようになってはいない。そのため目的の機能に対するインターフェースを作成することで機能拡張を行うことができる。GAVE の記述に Ruby が使われているため拡張での手間がかからない。。

だれでも使える。GAVE は無償であるため導入しやすいソフトウェアであるといえる。無償であることはソフトウェアの導入性が良いことにつながらないが、GAVE はインストール用のパッケージが用意されつつあり、ドキュメントもこのように整備されつつあるため

地球流体科学の研究に必要な機能を持つこと

GAVE は地球流体科学の研究を想定して作られているため地球流体科学にとって便利なな機能をもつライブラリを呼び出すことができる. 例えば地球科学における描画には地図投影する機能や欠損値処理が不可欠だろう. 例えば医学分野の可視化ソフトウェアであれば地図投影の機能はおそらくないだろうが GAVE では既に実装されている. 今後の開発でも地球流体科学の研究のためになる機能を中心に実装されると思われる.

3 機能概要

GAVE は多次元データに対して描画、データに対する数値演算、netCDF の自己記述された属性の表示、そして描画結果の保存ができる. 以下ではこれらの機能を説明する。

3.1 描画

描画方法

描画には次元変数を1つとる折れ線図と, 次元変数を2つとる等値線図の2種類が可能である. 選択した変数が2つ以上の次元を持つの場合はデフォルトで等値線図が選ばれる. その際選択した変数の最初の2つの次元が次元変数として選ばれる. また, 等値線図の場合, 地図投影法を用いることもできる(後述). 図2は左から折れ線図を書いた例, 等値線図を書いた例, 地図投影に正射図法を用いて等値線図を書いた例を並べたものである.

図のタイトル, 軸のタイトルと単位はデータの属性に該当する値があれば, その値がデフォルトで設定される. またユーザーが陽に設定することもできる. ただし描画された図中には英数字しか記述することができない.

折れ線・等値線・地図投影

図2:描画方法(左から折れ線, 等値線, 地図投影(ORTHOGRAPHIC))

地図投影

地図投影とは球面を2次元平面に投影する方法である。GAVE が現在利用できる地図投影は以下の4つの図法である.

図3は地図投影の例である.

地図投影の例

図3:地図投影の例. 左から ORTHOGRAPHIC, POLAR STEREO, AZIMUTHAL, AZIMUTHAL EQ.AREA である(ただし見やすさのため AZIMUTHAL と AZIMUTHAL EQ.AREA は等値線を消している)。

描画範囲指定

多次元データから切り出す面を指定する. 例えば, 緯度, 経度, 時間(月)の3次元の降水量データがあったとする. このデータから例えば, 8月の日本付近を描画範囲に指定するとしたら, 緯度を20°〜50°, 経度を東経120°〜160°に指定し時間を8月に指定する. ただし, 各軸に直行する断面しか切り出すことはできない.

アニメーション表示

空間的な構造や時間的な移り変わりなどを見るためデータをアニメーションとして表示することが可能である. 例えば前出の描画範囲指定で示したデータならば降水量の時間変化などを見ることができる. アニメーションの速度すなわち描画間隔も調節することができる. また, アニメーションは録画することも可能である(後述).

座標軸の選択

通常の座標軸または対数座標軸(片対数, 両対数)をとることができる。

等値線とトーンの調整

等値線とトーンの塗分けは自動的に適当な間隔が設定されて描画される. その設定を変更したい場合は手動で設定しなおすこともできる. データの特徴が最もよく表現されるように可視化するためには自動的に設定された値では不十分なことが多い. そこで手動で設定しなおす機能が用意されている. この設定も他の設定と同様に対話的に行うことができる. 特にトーンの設定は実際に変更した設定を見ないことには最適な設定になっているかどうか分からないため GUI の操作が非常に有効である.

欠損値処理

必要であれば欠損値を設定することができる. データの属性で欠損値が明示されていれば自動的にその値が欠損値として設定される.

3.2 データに対する数値演算

多次元データに対して数値演算を行うことができる. 現時点で実行可能な数値演算は平均, 最大, 最小, 標準偏差の4つである. 演算した結果は新しい変数として扱われるため再び演算することも描画することもできる。

3.3 属性表示

netCDF ファイルが持つ自己記述された情報を表示する機能を持っている. 通常これを確認するためには netCDF ライブラリに付属する ncdump というツールをコマンドラインから使って確認することができる. 同様のことが GAVE の属性表示機能でもできる.

3.4 描画結果の保存

画像の保存

描画結果を画像ファイルとして保存することができる. 保存する画像形式は拡張子によって判別される. PNG, JPEG , TIFF , PPM などの形式に対応している.

アニメーションの保存

アニメーション表示機能を使って描画されている絵を1コマずつ保存することができる. 保存形式は PPM であり, ファイルには自動的に通し番号が付く. GAVE の機能からは外れるが, PPM 形式の画像は MPEG 形式の動画にエンコードすることができる.

スクリプトの保存

可視化を再現する Ruby スクリプトを保存することができる。データファイルと, 保存したスクリプトをセットにしておけば可視化を再現することができる. さらに前節でふれたようにこのスクリプトに各々必要な修正を加える雛形として利用することができる.

4 内部動作

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

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

GAVE が利用している電脳 Ruby プロジェクトのライブラリはおおよそ図の橙、桃、青の点線で囲まれた部分に対応する。データの読込の機能に Ruby/NetCDF ライブラリ、描画機能に Ruby/DCL ライブラリ, 解析機能に GPhys ライブラリを用いている。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, 次元変数として緯度(degree north)、経度(degree east)、高度(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 の内部ではおおよそこのような動作をしている.  

まとめ

GAVE が多次元データを解析するために便利なソフトウェアの1つであることを示した。 まずデータから指向錯誤しながら断面を切り出す作業が非常に手軽にできる。 GUI で対話的に操作できるため、可視化しながら逐次、選択や修正を行うことができる。

GAVE は多次元データの解析に不慣れな人でも十分に機能を利用できるソフトウェアである。 近年の地球流体のデータを取り巻く環境の変化によって、 これまで多次元データを解析する機会が少なかった人も解析する機会が増えると思われる。 そうなると誰でも手軽に利用できるソフトウェアが重要になるはずである。 GAVE は GUI であるため CUI のソフトウェアに比べて機能を把握しやすい。 日本語に対応しているため、日本人であれば更に機能を把握しやすいだろう。 よって GAVE を使用するために使用方法を学ぶ労力をほとんど必要しない。 また、RedHat Linux、Debian Linux など一部の環境であればインストールパッケージを利用して 手軽にインストールすることができる(付録A 参照)。 したがって、GAVE は導入しやすいソフトウェアであると言える。

GAVE は、多次元データの解析を既に他のソフトウェアやライブラリを用いて行っている人に とっても非常に便利なソフトウェアである。 GAVE はソースが公開され改変も可能であるため各々求める機能を加えることができる。 GAVE が利用しているライブラリ(詳細は付録C 参照)も同様にソースが公開され改変も可能であるため これらのライブラリの機能から拡張することもできる。 これらのライブラリとは電脳 Ruby プロジェクトで開発されているライブラリであり 汎用言語である Ruby で記述してあるために拡張性が高い(Ruby については付録A 参照)。 また、GAVE はスクリプト作成支援ツールとして使うことができる。 可視化した手順を Ruby スクリプトとして保存することができるためである。 データファイルとスクリプトから可視化を再現することができるだけでなく、 このスクリプトを雛型として利用することで、解析スクリプトを手軽に作成することができる。

以上のように GAVE には幅広い活用方法があり、幅広い層の人にとって有用なソフトウェアである。 今後の開発に期待したい。

謝辞

本論文を書く上で大変多くの方々から有益な助言や暖かいご支援いただきました. まず初めに指導教官である林 祥介教授, 小高 正嗣助手に深く感謝します. お2人には本論文のテーマを与えてくださり、さらに地球流体の背景について教えて頂きました. また地球環境科学研究科・石渡 正樹助手には本論文の資料に関して助言をいただきました. 地球流体力学研究室の修士過程の塚原 大輔さんには本論分の例のために使用したデータを頂きました。そして森川 靖大さんとともに本論文の文章添削から論文全体の構成に至るまで, 親身にご指導頂きました. この場を借りてお礼申し上げます.








付録A 使用方法

この章ではまず使用するために動作環境とインストール方法に触れ, Debian Linux 環境で ECMWF/ERA40 再解析データを用いた GAVE の具体的な使用例を挙げる.

A.1 動作環境

GAVE は現在, 以下の環境で動作が確認されている.

A.2 インストール方法

RPM や Debian パッケージが用意されているのでそれを利用すれば簡単にインストールできるはずである. ここでは Debian Linux に Debian パッケージを用いてインストールする方法を示す。その他のインストール方法は電脳 Ruby プロジェクのインストールページに書いてあるためここでは触れない.

以下のパッケージをインストールすると GAVE が使用できる。

  1. ruby
  2. ruby-gnome-all
  3. cdcl
  4. ruby-narray
  5. numru-misc
  6. ruby-narray-miss
  7. ruby-dcl
  8. ruby-netcdf
  9. gphys
  10. gave
1, 2 は公式 Debian ディストリビューションに含まれているため Debian GNU/Linux からパッケージを入手するか、apt を使ってインストールする。 3〜9 は電脳 Ruby プロジェクトでパッケージが公開されているため、そこからパッケージを入手してインストールする。

A.3 データの入手

ECMWF/ERA40再解析データを用いた GAVE の使用例を示す. ECMWF からデータを入手するためには、まずユーザー登録する必要がある。 そして任意のデータを選択しダウンロードする。

今回の例では塚原によってストックされたデータベースから以下3つのファイルを用いている. これらファイルは ECMWF/ERA40 再解析データからの日単位で入手したデータを更に GPhys を用いて月平均をとったものである。

ファイル名データ
TP_2001-08_ERA40.nc2001年8月の降雨量
T_2001-08_ERA40.nc 2001年8月の気温
U_2001-08_ERA40.nc 2001年8月の東西風

表1: 使用ファイル一覧

A.4 起動方法

Xウィンドウが起動している状態でコンソールから

$ gave
として起動すると, GAVE が図14のように起動する.
起動直後のメインウィンドウ

図14: 起動直後のメインウィンドウ(ファイルを開いていない状態)

またはファイル名を引数にして
$ gave filename.nc
とする。

A.4 各ウィンドウの説明

GAVE で使われるウィンドウを並べた. メニューバーも並べた. メインウィンドウとは GAVE の起動時に立ち上がるウィンドを指す. 
メインウィンドウ

図5: メインウィンドウ

メニューバー

図6: メニューバー

変数

図7: 変数ウィンドウ

軸

図8: 軸ウィンドウ

次元

図9: 次元ウィンドウ

属性

図10: 属性ウィンドウ

アニメーション

図11: アニメーションウィンドウ

地図投影

図12: 地図投影ウィンドウ

等値線間隔

図13: 等値線間隔ウィンドウ

A.5 等値線図の描画例

等値線図の描画例として, ERA40再解析データより 2001年8月の気温を可視化する. ここで使うファイルは気温のデータで次元変数として 緯度(longitude), 経度(latitude), 気圧(levelist)の3変数 を持っている.

等値線図の描画

描画する対象の変数を選択する. 例では t しかないのでそれが選択されている.
次に動作に等値線(Contour)を選択する.
そして軸にとる次元変数を選択する. 例ではデフォルトの longitude と latitude が選択されている.

等値線を選択したメインウィンドウ

図15: 等値線を選択したメインウィンドウ


描画(Draw)ボタンをクリックすると等値線図が描画される.

2001年8月の気温(気圧=1mb) 軸[緯度, 経度]

図16: 2001年8月の気温(気圧=1mb) 軸[緯度, 経度]


表示位置とサイズの変更

ビューポートの内部をドラッグすることで表示位置を変更することができる. ビューポートの枠(軸)をドラッグすることでサイズが変更できる. ただし現在のバージョンでは文字も含めた描画範囲は正方形の領域しかとることが できない仕様になっている.

描画の位置とサイズを変更

図17: 描画の位置とサイズを変更


次元変数の変更

X軸とY軸にとる次元変数を選択しなおす. X軸にlatitude, Y軸にlevelsを選択した.

X軸, Y軸を latitude と levels に変更したメインウィンドウ

図18: X軸, Y軸を latitude と levels に変更したメインウィンドウ


描画ボタンをクリックして, 描画を開始するると次のようになる. 描画の表示位置とサイズは変更している.

2001年8月の気温(経度=0°) 軸[経度, 気圧]

図19: 2001年8月の気温(経度=0°) 軸[経度, 気圧]


各次元の値を設定

latitudeとlevelistは軸として使われているが, 残ったlonitudeは現在, デフォルトの東経0度が使われている. そこで東経140度の図を描きたい場合は次元ウィンドウで設定する.

次元(経度)を東経140度に設定

図20: 次元(経度)を東経140度に設定


描画してみる. 図の右側に「longitude 140 degrees_east」という文字列があることがわかる.

2001年8月の気温(経度=140°) 軸[経度, 気圧]

図21: 2001年8月の気温(経度=140°) 軸[経度, 気圧]

タイトルの変更

図のタイトルを変更することができる.

タイトルの変更

図22: タイトルの変更


これを描画すると次のようになりる.

2001年8月の気温(経度=140°) 軸[経度, 気圧] タイトル変更

図23: 2001年8月の気温(経度=140°) 軸[経度, 気圧] タイトル変更


軸のタイトルおよび単位の変更

軸に付属する文字列 (タイトルと単位) を変更することができる. これは軸ウィンドウから行う.

軸タイトル, 単位変更

図24: 軸タイトル, 単位変更


これを描画すると次のようになる. しかし、あまり的確な修正ではなかったので、図26ではまたもとに戻している。

2001年8月の気温(経度=140°) 軸[経度, 気圧] 軸変更

図25: 2001年8月の気温(経度=140°) 軸[経度, 気圧] 軸変更


対数グラフ

軸ウィンドウの対数チェックボタンをチェックすると 対数軸をとることが可能である.

対数軸をとる

図26: 対数軸をとる


例ではlevelist(気圧)のY軸を対数でとり片対数グラフにした. 次のようになりる.
2001年8月の気温(経度=0°) 軸[緯度, 気圧] 片対数

図27: 2001年8月の気温(経度=0°) 軸[緯度, 気圧] 片対数


描画範囲指定

軸ウィンドウの最小値と最大値を設定することで 描画の範囲をしていすることができる.

描画範囲を逆に設定することで上下, 左右反転させる こともできる.

描画範囲を指定して反転させる

図28: 描画範囲を指定して上下反転させる手続き


例では上下を反転させている. 1000mbが図の下して見やすくした.

2001年8月の気温(経度=0°) 軸[緯度, 気圧] 軸反転

図29: 2001年8月の気温(経度=0°) 軸[緯度, 気圧] 軸反転


等値線とトーンの間隔設定

等値線とトーンの間隔は自動で設定されるが 手動で設定することもできる. 等値線間隔およびトーン間隔ウィンドウの手動・自動を 切り替えて最小値と間隔を設定することで手動で設定が可能である.

等値線間隔およびトーン間隔の手動設定

図30: 等値線間隔およびトーン間隔の手動設定


最小値と間隔は変数tの範囲を考えて適当に設定してする. 何度か繰り返し設定しなおすことが必要になる.

2001年8月の気温(経度=0°) 軸[緯度, 気圧] 軸反転 (等値線/トーン手動設定)

図31: 2001年8月の気温(経度=0°) 軸[緯度, 気圧] 軸反転 (等値線/トーン手動設定)


属性の表示

各変数が持つ情報を表示する. メインウィンドウのメニューバーから属性ウィンドウを選択し表示させる. これでデータが持つ属性を表示する.

例をみると, 変数tは単位 K, longname が Temperature であり スケールファクタとオフセットが図のように設定されていて, 次元変数に longitude, latitude, levelist をもっていることがわかる. 大域属性はファイルの出所などファイルそのものに関する属性である.

属性ウィンドウ(longitude) 属性ウィンドウ(latitude) 属性ウィンドウ(levelist) 属性ウィンドウ(t) 属性ウィンドウ(大域変数)

図32: 属性ウィンドウとデータが持つ属性


折れ線グラフ

動作選択メニューから等値線の代わりに折れ線を選択すれば あとは等値線と同様に折れ線図を描くことができる.

折れ線を選択

図33: 折れ線を選択している状態


2001年8月の気温(緯度=0°, 経度=0°) 軸[気圧]

図34: 2001年8月の気温(緯度=0°, 経度=0°) 軸[気圧]


地図投影

地図投影法は4種類用意されている. 使用する投影法を地図投影ウィンドウから選択し, メインウィンドウの動作選択メニューから「地図投影(Map)」を選択する. 他の手順は等値線図を描く場合と同じである.

オーソグラフィックを選択した地図投影ウィンドウ

図35: 「オーソグラフィック」を選択した地図投影ウィンドウ

それぞれの投影法で描画してみる.

正射図法, 2001年8月の東西風(気圧=1000mb)

図36: 正射図法, 2001年8月の東西風(気圧=1000mb)

ポーラーステレオ図法, 2001年8月の東西風(気圧=1000mb)

図37: ポーラーステレオ図法, 2001年8月の東西風(気圧=1000mb)

, 正距方位図法, 2001年8月の東西風(気圧=1000mb)

図38: 正距方位図法, 2001年8月の東西風(気圧=1000mb)

ランベルト正積図法, 2001年8月の東西風(気圧=1000mb)

図39: ランベルト正積図法, 2001年8月の東西風(気圧=1000mb)


解析

描画対象となる物理量を解析する. 解析対象となる変数を選択し, 動作選択メニューから解析方法を選ぶ. 選択できる解析方法(関数)は現在4種類用意されている.

関数一覧

図40: 関数の一覧


解析方法を選択すると実行ボタンがその解析用の実行ボタンに変わる. 解析に使用する次元変数を選択して, その実行ボタンをクリックする.

平均化処理ができる状態

図41: 平均化処理ができる状態


すると解析されたデータが変数欄に新しくできる.

新しく変数ができた

図42: 新しい変数ができている状態

付録B 電脳 Ruby プロジェクト

B.1 特徴

本文で触れたように電脳 Ruby プロジェクトは多次元データの解析・可視化ライブラリを開発するプロジェクトである. Ruby の特徴であるオブジェクト指向というプログラムパラダイムを取り入れることで従来型の設計では実装が面倒だった処理がはるかにシンプルに実現している.

多次元データの科学技術データ形式は標準的なものでも数種類存在し, しかもデータが存在する媒体も1つではない. データがメモリにある場合と外部記憶装置にある場合ではデータにアクセスする手続きが異なる. もしネットワーク上のデータに直接アクセスする場合があればさらに複雑な手続きが考えられるだろう. また, netCDF などの自己記述型データ形式はデータがデータ自身を知っているためオブジェクト指向に親和的である. このような背景からオブジェクト指向言語を用いた開発がはじまったのは自然な流れであると考えられる. また, いくつかのオブジェクト指向言語の中からRubyを選択した理由はRubyが次のような特徴をもっているからである.

B.2 Ruby の特徴

Ruby は 10 年程前にまつもとゆきひろ氏[8]によって開発された言語であり, 言語としては新しい部類にはいる. そのため Smalltalk をはじめとした様々な言語の良い部分を取り込んだ言語になっている.

Ruby の特徴は手軽なプログラミングを求めた設計思想である. 何が可能かではなくいかに可能かという点を考慮している. 簡単なことを簡単に表現できる文法,

特に最初から純粋なオブジェクト指向言語として設計された言語であるため手軽にオブジェクト指向プログラミングができる特徴を持っている. 例えば C++ のように C 言語から受け継ぐ手続き型の記述も可能な言語では, 非オブジェクト指向的プラグラムと混在し, かえってすっきりしない設計に陥りやすい欠点をもつ. それに対しRuby は変数にデータ型が存在せず全てオブジェクトである. また, ほとんどの処理がメソッドであり, 関数, 手続き, コマンドといった区別がないという特徴をもつ. したがって Ruby は非オブジェクト指向的な設計になりにくい設計になっている.

また Ruby は非常に開発効率のよい言語である. オブジェクト指向そのものが開発効率の向上をめざした考え方でもあるので当然であるが, それに加えシンプルで柔軟な文法, さらには例外処理やイテレータなどの機構によって可読性の高いプログラムを書くことができる. また変数に型がないため, 型の管理をする必要がない(このようなことはオブジェクト自身が行う). さらには自動的にメモリ管理を行うガーベッジコレクタなどのプログラム支援機能があるためプログラミングでは機能の実装に集中できる. インタプリタであることも開発効率に貢献していると思われる.

GUI やネットワーク関連などのライブラリが既に開発されていることも Ruby 重要な特徴である. 特に GUI ライブラリは Ruby ではRuby/Gtk, Ruby/Tk, Ruby/Qt, Apollo(Delphi の機能を利用できるライブラリが付属)など非常に多い. 本論文で取り上げる GAVE は GUI を Ruby/Gtk で実装している.

欠点もいくつかあげられるが, 最も大きな欠点は速度である. まずインタプリタ型の言語であるためコンパイル型の言語に比べて実行速度が遅いのは当然である. また Ruby の柔軟な文法は他の言語に比べてパーサに負荷をかけており速度に影響を与えている. 電脳 Ruby プロジェクトでは大量の数値オブジェクトに対して計算を行うことになるため前者の問題が大きい. また Ruby の配列の要素は必ずオブジェクトである. もしもの配列で大きな多次元数値配列を扱うとしたら配列の要素全てを数値オブジェクトとして生成してしまうので, 速度だけでなくメモリの点からも非常に大きな問題になる.

しかし, この問題は拡張ライブラリを使うという方法でほぼ解決することができる. Ruby は C 言語で記述された言語である. そのため Ruby で書かれたプログラムは C 言語でも書くことが可能である(ただし冗長な定義やメモリ管理が必要). この C 言語で書かれたRubyのライブラリを拡張ライブラリという. C言語で記述してコンパイルされているプログラムであるため当然速度は速くなっている. このことからも Ruby の拡張性の高さが分かる. 多次元数値配列クラス NArray も拡張ライブラリのひとつである. NArray は通常の配列クラス Array とは異なり, 一様に並べられたポインタを構造体でくるんだものである. その結果, NArray高速な演算が可能である.

付録C GAVE が依存するライブラリ

GAVEが依存するライブラリの概要を説明する.

C.1 Gtk+

Gtk+は画像処理ソフトウェア Gimp のために開発された主に GUI を提供するためのツールキットである. Gimp が持つ機能を呼び出すことも可能であり, 描画, 対応する画像形式への変換などの機能も有する.

GAVE は Gtk+ の Ruby 拡張ライブラリである Ruby/Gtk を用いて GUI を実装している. Gtk+はC言語で記述されたライブラリだが, オブジェクト指向概念をもったライブラリである. たとえばウィンドウの部品(ウィジェット)は継承によって生成される. オブジェクト指向言語Rubyから利用できるRuby/Gtkではさらにオブジェクト指向のよい部分が導入されGtk+では冗長だった関数の呼び出しがシンプルになるなど開発効率が非常によくなっている.

C.2 netCDF ライブラリ

netCDF が自己記述・非機種依存型のデータ形式であることは本文で述べた. netCDF ライブラリは Unidataが持つ多くのアプリケーションに共通のデータアクセス方法を提供する目的で開発されたライブラリである. このライブラリを用いて netCDF ファイルのI/Oを行うことでバイトオーダーや浮動小数点表現の違いを吸収し, 機種に依存しないデータ形式が実現している.

Ruby/NetCDF[7] ライブラリは電脳 Ruby プロジェクトによって作成されたライブラリである. C, Fortran, C++, Perl から呼び出す netCDF ライブラリは Unidata から提供されていたが, Ruby 用の netCDF ライブラリはなかったため C 用のライブラリから拡張することで Ruby 用ライブラリが作成された. GAVE ではこの Ruby/NetCDF ライブラリを用いてnetCDF ファイルのI/Oを行っている.

C.3 DCL(Dennou Club Library)

DCL とは地球流体関係者が長年にわたり蓄積してきた Fortran の描画・数値計算ライブラリである(地球流体電脳倶楽部). DCL は地球流体関係者が開発しているため地球流体研究用途に準じた機能が豊富である. GAVE は描画に DCL を利用しているため DCL ライブラリが提供する等値線図の描画や地図投影が可能になっている. ベクトル場の描画など GAVE には実装されていない機能がたくさんあるが将来的には実装されるのだろうと思われる.

GAVEはDCLのRuby拡張ライブラリであるRubyDCL[5]に依存している.

C.4 GPhys

GPhys[7] は多次元物理量のための Ruby クラスライブラリである. GAVEは内部でデータをGPhsyクラスのオブジェクトとして持っている. またデータ形式や媒体によらず統一的なインターフェースを提供する. 現在 netCDF と GrADS のデータ形式に対応している. 地球科学で扱う非常にサイズの大きい多次元データを考えた設計になっている.

GPhsyは解析メソッドをもっている. GAVEの解析はこのメソッドを利用している. また簡単な描画用のモジュールが用意されているため, 解析・可視化スクリプトを簡潔な書式で実現できる. GPhysは中でNArrayというライブラリ用いている. NArrayはC言語で記述されたRuby拡張ライブラリであるため高速に演算することができる.

参考文献

  1. 地球流体電脳倶楽部: 地球流体電脳ライブラリ(DCL), http://www.gfd-dennou.org/arch/dcl/ , 地球流体電脳倶楽部
  2. 地球流体電脳倶楽部: 地球流体電脳ライブラリ リファレンスマニュアル, http://ruby.gfd-dennou.org/products/ruby-dcl/ruby-dcl-doc/ , 地球流体電脳倶楽部
  3. 電脳Rubyプロジェクト, http://www.gfd-dennou.org/arch/ruby/ , 地球流体電脳倶楽部
  4. ECMWF Re-Analysis ERA-40, http://www.ecmwf.int/research/era/, ECMWF
  5. 堀之内 武, 黒井 啓子, 後藤 謙太郎, 電脳 Ruby プロジェクト:RubyDCL, http://www.gfd-dennou.org/arch/ruby/products/ruby-dcl/ , 地球流体電脳倶楽部
  6. 堀之内 武, 水田 亮, 電脳 Ruby プロジェクト: GPhys, http://www.gfd-dennou.org/arch/ruby/products/gphys/ , 地球流体電脳倶楽部
  7. 堀之内 武, 榊間 俊洋, 電脳 Ruby プロジェクト: RubyNetCDF, http://www.gfd-dennou.org/arch/ruby/products/ruby-netcdf/ , 地球流体電脳倶楽部
  8. まつもとゆきひろ,石塚圭樹, 1999: オブジェクト指向スクリプト言語 Ruby (ASCII SOFTWARE SCIENCE Language 11), アスキー出版局
  9. 三並 慶佐, 2002: Ruby/Gtk プログラミング入門, 技術評論社
  10. 西澤誠也, 2003, GAVE, http://www.gfd-dennou.org/arch/ruby/products/ruby-dcl/ , 地球流体電脳倶楽部
  11. Ruby公式サイト, http://www.ruby-lang.org/ja/
  12. 田中昌宏, 2003, Numerical Ruby , http://www.ir.isas.ac.jp/~masa/ruby/
  13. Unidata,NCAR,netCDF http://www.unidata.ucar.edu/packages/netcdf/index.html