目次

1. はじめに

地球流体科学分野の研究において, 可視化は重要なデータの解析手法の1つである. 地球流体の研究者は衛星観測データや数値シミュレーション等によって生成されるデータを解析する. このデータは一般に多次元の数値データである. データの表現方法として, 折れ線図や等値線図などの2次元平面に表現する方法は人間にとって認識しやすい.

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

データを効率よく解析する手法の1つとして, グラフィカルユーザーインターフェース(以下 GUI)で対話的に可視化する手法がある. データから意図する特徴を探し出しそれを分かりやすく可視化するためには, 指向錯誤を繰り返しながら最適な表現方法を探す必要がある. この作業はバッチ処理のような手法よりも対話的に行う方が効率が良い. GUI ならば操作方法を覚えていなくても直感的に機能を把握することができるため, ソフトウェアに習熟していない段階でも可視化の表現を自由に行うことができる.

研究者にとって各々必要な機能を加え拡張するために, ソフトウェアはソースが公開されかつ改変されることが可能でなければならない. ソフトウェアに求める機能は研究対象によって様々である. 例えばデータに対する演算において精度をどの程度求めるかは研究によって異なる. このような要望は無限にあり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 では既に実装されている. 今後の開発でも地球流体科学の研究のためになる機能を中心に実装されると思われる.

3 機能概要

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

3.1 描画

描画方法

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

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

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

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

地図投影

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

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

地図投影の例

図3:地図投影の例. 左から正射図法, ポーラーステレオ図法, 正距方位図法, ランベルト正積方位図法である(ただし見やすさのため正距方位図法とランベルト正積方位図法は等値線を消している).

描画範囲指定

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

アニメーション表示

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

座標軸の選択

線形座標軸または対数座標軸(片対数, 両対数)をとることができる.

等値線とトーンの調整

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

欠損値処理

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

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

多次元データに対して数値演算を行うことができる. 現時点で実行可能な数値演算は平均, 最大, 最小, 標準偏差の4つである. 例えば次元変数に緯度, 経度, 時間(日)を持つある年の1月の降雨量のデータがあるとする. このデータを時間方向に平均をとれば, すなわち降雨量の1月平均のデータとなる. また演算した結果は新しい変数として扱われるため再び演算することも描画することもできる. この例であれば1月平均の降雨量の分布などを描画することが可能であり, 経度方向または緯度方向に再び演算することが可能である.

3.3 属性表示

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

3.4 描画結果の保存

画像の保存

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

アニメーションの保存

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

スクリプトの保存

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

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 の内部ではおおよそこのような動作をしている.  

まとめ

GAVE が多次元データを解析するために便利なソフトウェアの1つであることを示した.

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

GAVE は, 多次元データの解析を既に他のソフトウェアやライブラリを用いて行っている人にとっても非常に便利なソフトウェアである. まずデータから特徴を明確に描画するために指向錯誤しながら修正を行う作業を非常に手軽にできる. GUI によって, 可視化における変数の選択や修正を対話的に行うことができるためである. また, GAVE はソースが公開され改変も可能であるため各々求める機能を加えることができる. GAVE が利用しているライブラリ(詳細は付録C 参照)も同様にソースが公開され改変も可能であるためこれらのライブラリの機能から拡張することもできる. これらのライブラリとは電脳 Ruby プロジェクトで開発されているライブラリであり汎用言語である Ruby で記述してあるために拡張性が高い(Ruby については付録B 参照). また, 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/ERA40 からデータを入手するには, まず ECMWF に登録する必要がある. すると ECMWF/ERA40 から任意のデータを選択しダウンロードすることができる.

今回の例では以下3つのファイルを用いている. これらファイルは ECMWF/ERA40 再解析データから 2001年8月の降雨量、気温、東西風の日単位のデータを入手し、それを更に GPhys を用いて月平均したデータである.

データファイル名主変数従属変数
2001年8月の降雨量TP_2001-08_ERA40.nctplongitude, latitude
2001年8月の気温T_2001-08_ERA40.nctlongitude, latitude, levelist
2001年8月の東西風U_2001-08_ERA40.nculongitude, latitude, levelist

表1: 使用ファイル一覧

A.4 起動

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

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

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

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

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

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

図6: メインウィンドウ

メニューバー

図7: メニューバー


変数

図8: 変数ウィンドウ


軸

図9: 軸ウィンドウ


次元

図10: 次元ウィンドウ


属性

図11: 属性ウィンドウ


アニメーション

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


地図投影

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


等値線間隔

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


A.6 描画例

等値線図の描画例として, 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°) 軸[緯度, 気圧] 軸反転 (等値線/トーン手動設定)


折れ線グラフ

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

折れ線を選択

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


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

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


地図投影

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

正射図法を選択した地図投影ウィンドウ

図34: 「正射図法」を選択した地図投影ウィンドウ

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

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

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

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

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

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

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

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

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


A.7 属性の表示

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

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

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

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


A.8 データに対する数値演算例

データに対して数値演算する. 演算対象となる変数を選択し, 動作選択メニューから演算方法を選ぶ. 選択できる演算方法(関数)は現在4種類用意されている.

関数一覧

図40: 関数の一覧


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

平均化処理ができる状態

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


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

新しく変数ができた

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

新しくできた変数も同じように描画することができる. 新しい変数を図27と同様の設定で描画した.

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

図43: 2001年8月の気温(経度平均) 軸[緯度, 気圧] 片対数

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

B.1 目的

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

オブジェクト指向とは, 現実世界で対象とする物は全て, 自分自身がデータ(属性)とメソッド(振る舞い)を持つオブジェクトという表現単位, またはその集合であり, オブジェクトのあり方とその関連に着目することによって対象となるシステムをモデル化することができるという考え方である. この考え方をソフトウェアの世界に用いると, プログラムをオブジェクトという独立した部品として設計するため, 再利用しやすく保守性の高いソフトウェアに繋がり, 結果, 開発効率も上がる. しかしオブジェクト指向が必ず保守性・開発効率に優れるわけではなく, そのためには例えば Ruby のようなオブジェクト指向プログラミングを支援する機能を持つ言語を使い, オブジェクト指向技術を上手に使うことが必要である.

多次元データの解析において異なるデータ形式のデータも同じ統一されたメッセージ(命令)で扱うことができるとプログラミング効率を上げることができる。多次元データの科学技術データ形式は標準的なものでも数種類存在し, しかもデータが存在する媒体も1つではない. 異なるデータ形式のファイルを読み込むにはその形式ごとに異なるライブラリを用いて行う. 手続き型の設計で異なるファイルを読み込むプログラムを作成する場合には考えられるデータ形式の数だけ条件分岐を作る必要があるだろう. オブジェクト指向の設計では異なるデータ形式であってもデータ自身がデータの読み方を知っているため統一的なメッセージで扱う. そのため手続き型の場合に比べてプログラミングの負担が軽減される. また, 同様に異なる媒体にあるデータも統一的なメッセージで扱うことができるだろう. 異なる媒体とは, 例えば手元の計算機の場合とネットワーク上の場合である. ネットワーク上のデータであっても手元の計算機にあるデータと同じように扱うことができれば更にプログラミングに費やす労力を軽減することができる.

B.2 Ruby の特徴

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

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

また 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言語で記述し, コンパイルされているプログラムであるため当然速度は速くなっている. 多次元数値配列クラス NArray も拡張ライブラリのひとつである. NArray は通常の配列クラス Array とは異なり, 一様に並べられたポインタを構造体でくるんだものである. その結果, NArray ライブラリを使うと配列に対する高速な演算が可能である.

付録C GAVE から利用できるライブラリ

GAVE は電脳 Ruby プロジェクトで開発されているライブラリを利用するユーザーインターフェースであるため, GAVE 本体に可視化の機能が実装されているわけではない. 機能は以下で説明するライブラリを利用したものである.

C.1 Ruby/NetCDF ライブラリ

Ruby/NetCDF ライブラリは Unidata によって提供されている netCDF ライブラリの Ruby 用インターフェースである.

netCDF とは network Data Form の略で自己記述・非機種依存のデータ形式のことである. 自己記述とはデータ自身にデータの情報が記述してあるということである。変数に付属すべき情報(例えば名前, 単位, 配列の大きさなど)やファイルそのものに関する情報(例えばデータの製作者や製作日)が記述してあるためファイルを読めばそのデータがどのようなデータであるのか知ることができる。 netCDF ライブラリとは netCDF ファイルの読み込み, 書き込みを行うためのライブラリであり, このライブラリを用いることでバイトオーダーや浮動小数点表現の違いを吸収し, 機種に依存しないデータ形式を実現している.

GAVE ではこの Ruby/NetCDF ライブラリを用いて netCDF ファイルの読み込みを行っている. netCDF ファイルの属性表示もこのライブラリの機能である.

C.3 Ruby/DCL

Ruby/DCL は DCL(Dennou Club Library)の Ruby インターフェースである。

DCL とは地球流体関係者が長年にわたり開発・蓄積してきた Fortran77 で記述されたの描画・数値計算ライブラリである(地球流体電脳倶楽部). DCL の描画機能は地球流体の研究用途に準じたの2次元投影を中心に開発された。描画方法としては折れ線図のほか等値線描画やベクトル場描画が可能であり, 地図投影はメルカトル図法や正距方位図法など15種類の投影法が利用できる。地球流体科学分野の描画ライブラリとしては機能が豊富なライブラリであると言えるが, 3次元描画に関する機能はあまりない。また描画ライブラリだけでなく数値処理ライブラリも含まれており, 高速フーリエ変換などを利用できる。

GAVE は描画ライブラリとして Ruby/DCL を利用しているため DCL ライブラリが提供する等値線図の描画や地図投影が可能である. しかしベクトル場の描画など GAVE からまだ利用できない機能がたくさんある. これらの機能を利用したいならば, 各々 GAVE を拡張するとよい。

C.3 GPhys

GPhys は多次元物理量のための Ruby クラスライブラリである. GPhys というクラスで多次元データを扱うことによってデータ形式や媒体によらず統一的なメッセージでデータ解析が可能になる. 現在 GPhys が扱うことのできるデータ形式は netCDF と GrADS である. また, GPhys は中で NArray という多次元配列クラスライブラリを用いている. NArray はC言語で記述された Ruby 拡張ライブラリであるため配列の要素に対して高速な数値演算ができる.

GAVE は数値演算に GPhys のメソッドを利用している. そのため GPhys が持っている数値演算メソッドを GAVE から利用できるように GAVE を拡張することは用意に実現できる。しかし, GPhys が持っていない数値演算メソッドを作成するために Ruby でGPhys を拡張すると非常に遅い数値計算になってしまう. 高速な数値演算が可能なメソッドを加えるためには C 言語で NArray を拡張する必要がある.

参考文献

  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