本チュートリアルを始める前の準備です.
目次
GPhys は多次元データ解析可視化ライブラリです.GGraph は GPhys 付属の可視化ライブラリです.
このチュートリアルは,GPhys はインストールしてあるものとして進めます. もしもまだなら以下のページを参考にインストールしてください.
irb は Ruby の対話的インタープリターです. 本チュートリアルでは irb を多く使います.
コマンドライン端末で irb を立ち上げると, 1行入力する度にRubyコードとして実行され,結果が表示されます. irb を立ち上げるには,で irb と入力します. すると,入力待ちのプロンプト(irb(main):001:0> といった文字列)が表示されるので,とりあえず四則演算でもやってみましょう("1 + 2"がユーザーの入力です).
$ irb
1 + 2
=> 3
終了するには, exit と入力します.
exit
対話的可視化用設定ファイル irbrc_ggraph.rb をダウンロードしてホームディレクトリに置きます (ホームディレクトリは UNIX 系 OS では ~/ と表せます. Windows等では適当なフォルダーに置き,以下の ~/ はそれに読み替えてください).
この設定ファイルを読み込んで irb を立ち上げるには
$ irb -r ~/irbrc_ggraph.rb
とします.毎回これをタイプするのは面倒ですので,次の 1, 2 のいずれかによって,もっと簡単に使えるようにしましょう.
スタートアップファイルへの登録.
ホームディレクトリに .irbrc というファイルを作り,中身に次の行を書きます.
require "~/irbrc_ggraph.rb"
すると,単にコマンドラインで irb と入力するだけで irbrc_ggraph.rb が読み込まれます.
別名の設定 (linuxなどUNIX系のOSのみ) (cf Windowsの場合)
もしも必要なときだけ irbrc_ggraph.rb を読み込むようにしたければ,別名を設定しましょう. 例えば bash を使ってる場合, ~/.bashrc 適当なエディタで開きます. gedit を使う場合は以下のようにします.
$ gedit ~/.bashrc
ファイルの末尾に次の行を加えます.
alias irb_ggraph="irb -r ~/irbrc_ggraph.rb"
最後は改行で終わるようにします. 保存してエディタを終了してください. こうしておけばコマンド名のタブ補完が効きますので,名前を全部覚えてなくても大丈夫です.
設定を反映するために以下のコマンドを入力します. これはこのとき一回だけで構いません.
$ source ~/.bashrc
これで,
$ irb_ggraph
とすれば irbrc_ggraph.rb が読み込んで irb が始まります. "Start interactive GGraph session" の次に irb のプロンプトが表示されていれば設定に成功しています. 成功が確認できたら, 再び終了しておきます.
exit
本チュートリアルでは (2) の方法を使います.(1) の方法を使う場合, $ irb_ggraph と書いてあれば $ irb と読み替えてください.
現在 (GPhys 1.2.2),Windows上では GPhys のディレクトリ機能が使えないので, その機能を除いたスタートアップファイル irbrc_ggraph_win.rb を使ってください.NumRu パッケージ を使っている場合は,C:\NumRu\Ruby\bin に置くと良いです.同ディレクトリにさらに, irb_ggraph, irb_ggraph.bat を置くとコマンドラインプロンプトで
irb_ggraph
と,上記と同様に使えます.ただし,ディレクトリ機能が使えないため,
次章以降で用いる gpopen
というメソッドは使えません.
このため,次章以降で例えば
gp = gpopen 'air.2012-01.nc/air'
となっているところは,
gp = GPhys::IO.open 'air.2012-01.nc','air'
などとしてください.(gpopen
--> GPhys::IO.open
とし,
パスの最後のスラッシュを ','
で置き換えます
(やってることは,ファイル名と変数名を分離して引数を2つにする,です).)
本チュートリアルでは次のデータを使います. ダウンロードして適当なディレクトリー(フォルダー)においてください. チュートリアルはすべてそのディレクトリーで実行します.
これらは NCEP-DOE Rananalysis2 による客観解析(再解析)データで,ファイル形式は NetCDF です.
いずれも経度緯度2.5度の等間隔データで,mslp 以外は鉛直には気圧座標のデータとなります(1000, 925, 850, 700, 600, 500, 400, 300, 250, 200, 150, 100, 70, 50, 30, 20, 10 hPa の17層).1000 hPa などは「地面の下」(つまり実際にはその気圧の箇所は存在しない)ところも多いですが,その場合補外となっています(だから南極やチベット高原でも 1000 hPa の「気温」が定義されています). これらのファイルは上記のサイトから取得できるデータを こちら に置いた Ruby プログラムで加工して作りました(GPhysを使っています.なお1月の気候値のみの切り出しは対話的に行いました).
コマンドラインで NetCDF データの内容を確認するには ncdump コマンドを使います (オプション -h をつけます).以下で2行目以降は ncdump の出力です.
$ ncdump -h air.2012-01.nc netcdf air.2012-01 { dimensions: lon = 144 ; lat = 73 ; level = 17 ; time = 31 ; variables: float lon(lon) ; lon:units = "degrees_east" ; lon:long_name = "Longitude" ; lon:actual_range = 0.f, 357.5f ; lon:standard_name = "longitude" ; lon:axis = "X" ; float lat(lat) ; lat:units = "degrees_north" ; lat:actual_range = 90.f, -90.f ; lat:long_name = "Latitude" ; lat:standard_name = "latitude" ; lat:axis = "Y" ; float level(level) ; level:units = "millibar" ; level:actual_range = 1000.f, 10.f ; level:long_name = "Level" ; level:positive = "down" ; level:GRIB_id = 100s ; level:GRIB_name = "hPa" ; level:axis = "Z" ; double time(time) ; time:units = "hours since 1-1-1 00:00:0.0" ; time:long_name = "Time" ; time:actual_range = 17628096., 17629344. ; time:delta_t = "0000-00-01 00:00:00" ; time:avg_period = "0000-00-01 00:00:00" ; time:standard_name = "time" ; time:axis = "T" ; short air(time, level, lat, lon) ; air:long_name = "mean Daily Air temperature" ; air:unpacked_valid_range = 150.f, 350.f ; air:actual_range = 185.3f, 314.275f ; air:units = "degK" ; air:add_offset = 477.66f ; air:scale_factor = 0.01f ; air:missing_value = 32766s ; air:precision = 2s ; air:least_significant_digit = 1s ; air:GRIB_id = 11s ; air:GRIB_name = "TMP" ; air:var_desc = "Air temperature" ; air:dataset = "NCEP Reanalysis Daily Averages" ; air:level_desc = "Multiple levels" ; air:statistic = "Mean" ; air:parent_stat = "Individual Obs" ; air:valid_range = -32766s, -12766s ; // global attributes: :Conventions = "COARDS" ; :title = "mean daily NMC reanalysis (2012)" ; :history = "created 2011/12 by Hoop (netCDF2.3)\n", "2012-02-28 18:40:29 JST horinout> extractJan.rb wrote air" ; :description = "Data is from NMC initialized reanalysis\n", "(4x/day). It consists of most variables interpolated to\n", "pressure surfaces from model (sigma) surfaces." ; :platform = "Model" ; :references = "http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html" ; }
ncdump -h の出力の見方を簡単に説明します. dimensions: 欄は「次元」定義です.名前と長さの組になります. その下の variables: 欄で配列を定義しますが, 配列の各次元の長さはこの次元の名前で特定されます. 下のほうにある air(time, level, lat, lon) は,気温データを保持する4次元配列です. ncdump の出力は,C言語の配列のように,メモリー上で 近接する次元(lon)を後ろに,もっとも飛び飛びの次元(time)を前に 配置します(C言語方式). Fortran 式なら,air(lon, lat, level, time) となるところです. これから学ぶ Ruby での多次元データ型 GPhys や NArray では, 次元は Fortran 式に並べます.したがって,lon が最初の次元です. air は short すなわち2バイト整数型でファイルに格納されてますが, その属性 add_offset, scale_factor により,実際の値は 0.01 刻みで計算機上は単精度実数に格納されるべきことが指定されています. 他に,単位 (units) や,名前 (long_name) などの属性があります. また,valid_range によって,その範囲外の値は異常値(データ欠損等)であることが指定されています(ただし,実際にはこのデータには欠損はありません. 実はNCEP再解析データは地面より下に外挿されてます.チベット高原の下などでも!). これらの属性は NetCDF の仕様として標準化されています.
variables: 欄の最初の4つの1次元配列 lon, lat, level, time は,それぞれの次元の座標値を格納します. NetCDF では,このような「変数名」=「次元名」となる配列を座標値として 用いることが規約で決まっています.ですから,気温データ air の各データが,どの位置どの時刻に関するものかがこれで指定されていることになります.
このように NetCDF ではデータを記述する情報(メタデータ)が, 規則に基づいて格納されています. このようなデータを「自己記述的」であるといいます. GPhys ではこの特徴を活かして座標も含めデータを一体的に取り扱います.
NetCDF については
を参照してください.
[次へ進む]